关键词:LuatOS、crypto API、哈希函数、对称加密、CRC 校验、TOTP、Base64、TRNG
LuatOS 为物联网开发者提供了一套开箱即用的安全算法库 crypto。本文以实际场景为线索,梳理全部 30 余个函数,配以简洁示例与常见问题 FAQ,确保你在 10 分钟内即可上手加密、解密与数据完整性校验的所有主流需求。
1. 哈希函数:MD5 / SHA1 / SHA256 / SHA512
单向摘要场景
- 校验固件完整性
- 密码安全措施(加盐后不可逆)
- 快速指纹文件比对
代码示例
-- MD5 简单摘要
local digest = crypto.md5("hello") -- 输出 32 位十六进制字符串
print("MD5", digest)
-- SHA256 + HMAC(带密钥的哈希)
local hmac256 = crypto.hmac_sha256("hello", "key123")
print("HMAC-SHA256", hmac256)文件级哈希
无需加载整个文件即可计算,节省内存:
-- 固件 SHA256 验证
local fw_hash = crypto.md_file("SHA256", "/luadb/firmware.bin")
if fw_hash ~= expected_hash then
log.error("固件完整性校验失败")
end2. 对称加密:AES ECB / CBC 全模式
| 参数 | 说明 |
|---|---|
| type | 如 "AES-128-CBC" 可用 crypto.cipher_list() 查询 |
| padding | 推荐 "PKCS7",其他选项见官方文档 |
| str | 明文或密文字节串 |
| key | 长度须匹配算法(128/192/256 bit) |
| iv | 非 ECB 模式必填 |
端到端加密实例
local function aes_encrypt(plainText)
local key = "1234567890ABCDEF"
local iv = "0000111122223333"
return crypto.cipher_encrypt("AES-128-CBC", "PKCS7", plainText, key, iv)
end
local cipher = aes_encrypt("sensorData=23.5")
print("密文", cipher)3. 校验码 & CRC:物联网通信的护身符
场景速配
- CRC16 Modbus:标准传感器协议
- CRC32:ZIP、固件差分更新包
- CRC8 / CRC7:I²C、SD 卡指令
一行式调用
local frame = "\x02\x04\x00\x01\x00\x02"
local crc = crypto.crc16_modbus(frame)
-- 自动附带高低字节顺序4. Base64:非文本数据的 HTTP 或 MQTT 传输
local json = '{"temp":27.3,"hum":60}'
local b64 = crypto.base64_encode(json)
mqtt_client:publish("device/data", b64)解码仅需 crypto.base64_decode(b64),兼容老版本 string.toBase64。
5. HOTP / TOTP:两步验证秒集成
实现两类动态口令:
crypto.totp(secret, time)—— 同步时钟派生 6 位代码crypto.hotp(secret, counter)—— 事件驱动 OTP(LuaTRNG 配合)
-- Google Authenticator 格式
local otp = crypto.totp("JBSWY3DPEHPK3PXP")
print("动态口令:", otp)6. 真随机数 TRNG:密钥、令牌一秒生成
-- 32 字节(256-bit)随机密钥
local key = crypto.trng(32)
print("一次性密钥", crypto.base64_encode(key))7. 流式哈希:分片计算大文件
避免一次性加载百兆文件到内存。
local stream = crypto.hash_init("SHA256")
while true do
local chunk = file.read(4096)
if not chunk then break end
crypto.hash_update(stream, chunk)
end
local file_sha = crypto.hash_finish(stream)
print("文件 SHA256", file_sha)8. 快速查询:crypto.cipher_list() 与 crypto.cipher_suites()
日常排查:
local supported = crypto.cipher_list()
for _, name in ipairs(supported) do
print("支持算法", name)
end常见问题 FAQ
Q1:AES key 长度写错直接死机?
A:确保长度与算法匹配。AES-128=16 Byte,AES-192=24 Byte,AES-256=32 Byte。可以用 string.len(key) 先自检。
Q2:CRC16 结果为何与在线工具不一致?
A:CRC 初始值、多项式、反转位三项需一致。crypto.crc16("MODBUS", data) 已配好官方参数。
Q3:Base64 太长担心内存?
A:LuatOS 使用分段内存,1 MB 之内无需担心。过万字节时对 LED 屏打卡展示也无压力。
Q4:TOTP 时间窗口漂移怎么办?
A:传入 crypto.totp(secret, os.time() ± 30) 允许 ±1 窗口。固件内置 NTP 校时后基本不会漂移。
Q5:如何验证固件升级后 crypto 模块仍存在?
A:测试行 assert(crypto.md5("abc") == "900150983cd24fb0d6963f7d28e17f72"),打印成功即可继续升级。
Q6:流式哈希可以中途加 salt 吗?
A:不能。需在 hash_init 里一次性带入 HMAC。若需动态加盐,请重新创建新流对象。
小结
- 固件安全 = 摘要 + 加密 + 校验
- 通信安全 = 对称加密 + CRC + Base64
- 身份安全 = TOTP + TRNG
完整掌握 30+ 个 crypto 函数,你已为物联网设备加上数字安全“三重锁”。
现在就动手把上述片段拼成最小安全样板,部署到 Air780E 或 Air700E 系列模块,现场验证加密链路吧!