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更新里,签名流程一般是这样的:

  1. 服务器计算固件的哈希值。
  2. 用私钥对哈希值签名,生成签名数据。
  3. 把固件 + 签名数据一起发给设备。
  4. 设备收到后,用公钥验证签名。
  5. 验证通过,再算一遍固件哈希,跟签名里的哈希比对。

为什么会这样?因为签名本身已经包含了哈希,但设备端再算一遍,能防止签名被替换后哈希也被篡改。

3.4.1 签名算法对比

算法 签名长度 验证速度 推荐场景
RSA-PSS 256字节(2048位) 慢 PC端或高性能嵌入式
ECDSA 64字节(P-256) 快 MCU首选
Ed25519 64字节 极快 新项目强烈推荐
SM2 64字节 中等 国密合规

我的经验:Ed25519是我现在做新项目的首选。签名短、验证快、实现简单,而且抗侧信道攻击。唯一的问题是有些老芯片的加密库不支持,需要自己移植。

3.5 知识体系总览

下面这张图,把这一章的核心逻辑串起来了。你看一遍,应该能明白各个密码学工具在OTA里是怎么配合的。

OTA固件更新密码学体系 OTA固件更新密码学体系 安全目标:机密性 + 完整性 + 身份认证 对称加密 非对称加密 哈希函数 AES-128-GCM ChaCha20-Poly1305 SM4 ECDSA / Ed25519 RSA-PSS SM2 SHA-256 SHA-3 SM3 数字签名 = 哈希函数 + 非对称加密 OTA安全固件更新 对称加密保机密性,哈希函数保完整性,数字签名保身份认证,三者缺一不可

3.6 实战中的组合策略

讲完理论,咱们看看实际OTA里怎么用。我个人习惯用“混合加密”方案:

  1. 固件加密:用AES-128-GCM对称加密。速度快,适合大固件。
  2. 密钥保护:用ECC公钥加密AES密钥。这样每次会话的密钥都不同。
  3. 完整性校验:用SHA-256算固件哈希。
  4. 身份认证:用Ed25519对哈希签名。

你想想看,这样一套组合拳下来,攻击者想搞破坏,得同时破解对称加密、非对称加密和哈希函数。难度不是加法,是乘法。

避坑指南:我曾经在一个项目里,只用了签名没加密。结果固件虽然没被篡改,但被竞争对手抓包分析,把核心算法抄走了。所以,如果固件里有核心知识产权,一定要加密。

3.7 小结

这一章的内容,说白了就是四句话:

  • 对称加密:快,但密钥分发是难题。
  • 非对称加密:慢,但密钥管理简单。
  • 哈希函数:固件的指纹,防篡改。
  • 数字签名:哈希 + 非对称,验明正身。

记住,没有银弹。每种技术都有自己的适用场景。做OTA安全,不是选最牛的算法,而是选最合适的组合。