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 明文传输。

密钥管理的核心原则:

  1. 密钥不能明文存储:至少要用硬件安全模块(HSM)或安全元件(SE)保护
  2. 密钥要分级:根密钥保护子密钥,子密钥保护数据
  3. 密钥要定期更换:尤其是设备量大的场景
  4. 密钥要有备份和恢复机制:别把自己锁在门外

避坑指南:我曾经在一个项目中,把 AES 密钥放在 Flash 的某个固定地址,还加了「混淆」——其实就是 XOR 了一个固定值。结果攻击者用调试器读 Flash,一眼就看穿了。嗯,从那以后我再也不相信「自己发明的加密」。

2.6 知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速参考。

固件加密基础体系 固件加密基础体系 对称加密 非对称加密 哈希算法 消息认证码 密钥管理 说明:对称加密速度快,非对称加密安全但慢,哈希用于完整性校验, 消息认证码用于身份认证,密钥管理是这一切的基础。

2.7 实战建议

说了这么多,到底怎么用?我给你几个实际建议:

  • 固件加密:用 AES-128 加密固件,用 ECC 或 RSA 加密 AES 密钥
  • 固件完整性校验:用 SHA-256 计算哈希值,启动时对比
  • 固件身份认证:用 HMAC-SHA256 或数字签名(非对称签名)
  • 密钥存储:用安全元件(SE)或 TrustZone 保护,别放 Flash 里

我的习惯:每次做新项目,我都会先画一张「密钥生命周期图」——从生成、分发、使用到销毁,每一步都明确。这样能避免很多坑。

加密不是万能的,但不加密是万万不能的。你想想看,如果你的固件被抄板、被逆向、被植入后门,那损失可不止是钱的问题。嗯,这一章的内容够你消化一阵子了,先把基础打牢,后面咱们再深入实战。