3. 密码学基础:对称加密与非对称加密、哈希函数、数字签名原理
做OTA固件更新,说白了就是在跟时间赛跑,同时还得防着各路“神仙”搞破坏。密码学就是咱们手里最趁手的工具。这一章,我把工作中最常用的几个密码学概念掰开揉碎讲清楚。不扯玄乎的理论,全是实战里能直接用的东西。
核心观点:OTA安全不是靠单一算法,而是靠对称加密、非对称加密、哈希函数、数字签名这四驾马车协同作战。缺一个,你的固件更新就可能被攻破。
3.1 对称加密:又快又简单,但有个致命弱点
对称加密,加密和解密用的是同一把钥匙。就像你家里的大门,用一把钥匙锁上,再用同一把钥匙打开。
我最早做嵌入式项目时,图省事,直接用AES-128加密固件。当时觉得挺安全,直到后来发现密钥硬编码在代码里,被反编译出来……嗯,从那以后我再也不敢把密钥写死在固件里了。
3.1.1 常用算法
| 算法 | 密钥长度 | 特点 | 我的建议 |
|---|---|---|---|
| AES | 128/192/256位 | 硬件加速支持好,速度快 | 首选,尤其128位在MCU上够用 |
| ChaCha20 | 256位 | 软件实现效率高,抗侧信道攻击 | 没有AES硬件加速时推荐 |
| SM4 | 128位 | 国密标准,国内项目必须用 | 合规需求时使用 |
3.1.2 实战中的坑
- 密钥存储:别放Flash里。用芯片内置的OTP(一次性可编程)区域,或者安全元件(SE)。
- IV(初始化向量):每次加密必须用不同的IV。我见过有人用固定IV,结果同样的固件每次加密结果都一样,等于没加密。
- 模式选择:GCM模式自带认证,能防篡改。CBC模式需要额外加MAC,麻烦。
我的习惯:在资源受限的MCU上,我通常用AES-128-GCM。加密的同时完成完整性校验,省一次哈希计算的开销。
3.2 非对称加密:慢但安全,密钥管理省心
非对称加密,有一对钥匙:公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密,只有私钥能解开;反过来,用私钥签名,公钥能验证。
你想想看,OTA场景里,设备端只需要存一个公钥。就算被提取出来,攻击者也干不了坏事——他没法用公钥去伪造签名。
3.2.1 常用算法
| 算法 | 典型密钥长度 | 性能 | 适用场景 |
|---|---|---|---|
| RSA | 2048/4096位 | 慢,尤其私钥操作 | 签名验证,密钥交换 |
| ECC(椭圆曲线) | 256位(相当于RSA 3072) | 快,密钥短 | 嵌入式首选,签名和密钥交换 |
| SM2 | 256位 | 国密标准 | 国内合规项目 |
避坑指南:我曾经在一个项目里用RSA 2048做签名验证,结果MCU算一次签名验证要3秒多。后来换成ECC P-256,降到200毫秒。所以,嵌入式里能用ECC就别用RSA。
3.3 哈希函数:固件的“指纹”
哈希函数能把任意长度的数据,变成固定长度的摘要(digest)。而且,哪怕只改一个比特,摘要就完全不一样。这玩意儿没法逆向,所以叫“单向函数”。
OTA里,哈希函数主要干两件事:
- 完整性校验:下载完固件,算个哈希,跟服务器给的比对一下,看有没有被篡改。
- 数字签名的预处理:先对固件哈希,再对哈希签名。这样签名速度快,而且能处理任意大小的固件。
3.3.1 常用算法
| 算法 | 摘要长度 | 安全性 | 我的选择 |
|---|---|---|---|
| SHA-256 | 256位 | 目前安全 | 通用场景首选 |
| SHA-3 | 可配置 | 新一代标准 | 新项目可以考虑 |
| SM3 | 256位 | 国密标准 | 合规需求 |
避坑指南:别用MD5和SHA-1。我知道有些老项目还在用,但碰撞攻击已经实用化了。我见过一个案例,攻击者用两个不同固件算出相同MD5,绕过了完整性检查。所以,至少用SHA-256。
3.4 数字签名:让固件“验明正身”
数字签名,说白了就是给固件盖个章。这个章只有服务器能盖(私钥签名),但任何人都能验(公钥验证)。
OTA更新里,签名流程一般是这样的:
- 服务器计算固件的哈希值。
- 用私钥对哈希值签名,生成签名数据。
- 把固件 + 签名数据一起发给设备。
- 设备收到后,用公钥验证签名。
- 验证通过,再算一遍固件哈希,跟签名里的哈希比对。
为什么会这样?因为签名本身已经包含了哈希,但设备端再算一遍,能防止签名被替换后哈希也被篡改。
3.4.1 签名算法对比
| 算法 | 签名长度 | 验证速度 | 推荐场景 |
|---|---|---|---|
| RSA-PSS | 256字节(2048位) | 慢 | PC端或高性能嵌入式 |
| ECDSA | 64字节(P-256) | 快 | MCU首选 |
| Ed25519 | 64字节 | 极快 | 新项目强烈推荐 |
| SM2 | 64字节 | 中等 | 国密合规 |
我的经验:Ed25519是我现在做新项目的首选。签名短、验证快、实现简单,而且抗侧信道攻击。唯一的问题是有些老芯片的加密库不支持,需要自己移植。
3.5 知识体系总览
下面这张图,把这一章的核心逻辑串起来了。你看一遍,应该能明白各个密码学工具在OTA里是怎么配合的。
3.6 实战中的组合策略
讲完理论,咱们看看实际OTA里怎么用。我个人习惯用“混合加密”方案:
- 固件加密:用AES-128-GCM对称加密。速度快,适合大固件。
- 密钥保护:用ECC公钥加密AES密钥。这样每次会话的密钥都不同。
- 完整性校验:用SHA-256算固件哈希。
- 身份认证:用Ed25519对哈希签名。
你想想看,这样一套组合拳下来,攻击者想搞破坏,得同时破解对称加密、非对称加密和哈希函数。难度不是加法,是乘法。
避坑指南:我曾经在一个项目里,只用了签名没加密。结果固件虽然没被篡改,但被竞争对手抓包分析,把核心算法抄走了。所以,如果固件里有核心知识产权,一定要加密。
3.7 小结
这一章的内容,说白了就是四句话:
- 对称加密:快,但密钥分发是难题。
- 非对称加密:慢,但密钥管理简单。
- 哈希函数:固件的指纹,防篡改。
- 数字签名:哈希 + 非对称,验明正身。
记住,没有银弹。每种技术都有自己的适用场景。做OTA安全,不是选最牛的算法,而是选最合适的组合。