2. 固件加密基础:对称加密与非对称加密、哈希算法与消息认证码、密钥管理基础
加密这事儿,说白了就是给固件穿上一件防弹衣。我在做嵌入式安全的头几年,见过太多产品因为加密没做好,被抄板、被逆向、被远程篡改。嗯,今天咱们就把加密的底裤扒干净,看看它到底怎么保护你的固件。
2.1 对称加密:又快又简单,但有个大麻烦
对称加密,就是加密和解密用同一把钥匙。你想想看,就像你家大门,锁门和开门用的是同一把钥匙。常见的算法有 AES、DES、SM4(国密)。
AES 是目前的主流。我个人习惯用 AES-128 或 AES-256,128 位密钥在嵌入式设备上性能足够,256 位更安全但稍微慢一点。DES 就别用了,太老,容易破。
核心要点:对称加密速度快,适合加密大量数据。但密钥分发是个大坑——你得想办法把钥匙安全地交给对方。
我在项目中遇到过一件事:某 IoT 设备用 AES 加密固件,但密钥硬编码在代码里。结果呢?攻击者用 JTAG 把 Flash 读出来,密钥直接暴露。嗯,这就是典型的「锁没坏,钥匙丢了」。
常见对称加密算法对比
| 算法 | 密钥长度 | 速度 | 安全性 | 适用场景 |
|---|---|---|---|---|
| AES-128 | 128 bit | 快 | 高 | 固件加密、通信加密 |
| AES-256 | 256 bit | 中等 | 极高 | 高安全需求 |
| SM4 | 128 bit | 快 | 高 | 国密合规场景 |
| DES | 56 bit | 快 | 低(已淘汰) | 别用了 |
2.2 非对称加密:安全但慢,适合干大事
非对称加密,用一对钥匙:公钥加密,私钥解密。公钥可以公开,私钥自己藏好。常见的算法有 RSA、ECC、SM2。
为什么需要它?因为对称加密的密钥分发太头疼了。你想想看,如果设备在工厂生产时,每台设备都要烧录一个不同的密钥,那管理成本得多高?非对称加密就能解决这个问题:设备里只放公钥,私钥留在服务器端。
RSA 和 ECC 怎么选? 我个人建议:资源受限的 MCU 用 ECC,因为 ECC 在同等安全强度下密钥更短、计算更快。比如 ECC-256 的安全性和 RSA-3072 差不多,但密钥长度只有 1/10。
小技巧:实际项目中,我经常用「混合加密」——用非对称加密传输对称密钥,然后用对称密钥加密固件。这样既安全又高效。
非对称加密算法对比
| 算法 | 密钥长度 | 速度 | 安全性 | 适用场景 |
|---|---|---|---|---|
| RSA-2048 | 2048 bit | 慢 | 高 | 签名、密钥交换 |
| ECC-256 | 256 bit | 中等 | 高 | 嵌入式签名、密钥协商 |
| SM2 | 256 bit | 中等 | 高 | 国密合规场景 |
2.3 哈希算法:指纹识别器
哈希算法,就是把任意长度的数据,算出一个固定长度的「指纹」。常见的算法有 SHA-256、SHA-1、MD5。
哈希的特点:
- 不可逆:从哈希值推不出原始数据
- 唯一性:不同数据几乎不可能有相同哈希值
- 固定长度:不管输入多大,输出都是固定长度
我在项目中用哈希做固件完整性校验。比如 OTA 升级时,先算一下固件的 SHA-256 值,和服务器下发的哈希值对比。如果对不上,说明固件被篡改了,直接拒绝升级。
注意:MD5 和 SHA-1 已经被证明不安全,别再用了。SHA-256 是目前的最低标准。
2.4 消息认证码:给数据加个防伪标签
哈希只能保证数据没被改,但不能保证数据是谁发的。消息认证码(MAC)就能解决这个问题——它用密钥对数据做认证,只有持有密钥的人才能生成正确的 MAC。
常见的 MAC 算法:
- HMAC:基于哈希的 MAC,比如 HMAC-SHA256
- CMAC:基于对称加密的 MAC
我建议用 HMAC-SHA256。它在嵌入式设备上实现简单,安全性也够。我曾经在一个项目中,用 HMAC 做固件包的认证,防止中间人攻击。效果不错,但要注意密钥的保护——密钥泄露了,HMAC 就形同虚设。
2.5 密钥管理基础:最容易被忽视的环节
加密算法再强,密钥管理不好,一切都是白搭。我见过太多项目,加密算法选得挺好,结果密钥直接写在代码里、存在 Flash 里、或者通过 UART 明文传输。
密钥管理的核心原则:
- 密钥不能明文存储:至少要用硬件安全模块(HSM)或安全元件(SE)保护
- 密钥要分级:根密钥保护子密钥,子密钥保护数据
- 密钥要定期更换:尤其是设备量大的场景
- 密钥要有备份和恢复机制:别把自己锁在门外
避坑指南:我曾经在一个项目中,把 AES 密钥放在 Flash 的某个固定地址,还加了「混淆」——其实就是 XOR 了一个固定值。结果攻击者用调试器读 Flash,一眼就看穿了。嗯,从那以后我再也不相信「自己发明的加密」。
2.6 知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速参考。
2.7 实战建议
说了这么多,到底怎么用?我给你几个实际建议:
- 固件加密:用 AES-128 加密固件,用 ECC 或 RSA 加密 AES 密钥
- 固件完整性校验:用 SHA-256 计算哈希值,启动时对比
- 固件身份认证:用 HMAC-SHA256 或数字签名(非对称签名)
- 密钥存储:用安全元件(SE)或 TrustZone 保护,别放 Flash 里
我的习惯:每次做新项目,我都会先画一张「密钥生命周期图」——从生成、分发、使用到销毁,每一步都明确。这样能避免很多坑。
加密不是万能的,但不加密是万万不能的。你想想看,如果你的固件被抄板、被逆向、被植入后门,那损失可不止是钱的问题。嗯,这一章的内容够你消化一阵子了,先把基础打牢,后面咱们再深入实战。