固件加密基础:对称加密与非对称加密、哈希函数与消息认证码、密钥管理基础
加密这件事,说白了就是给固件穿上一件防弹衣。我在嵌入式安全这行干了十几年,见过太多因为加密没做好导致产品被抄、被篡改的案例。今天咱们就把这块地基打牢。
对称加密:又快又简单,但有个致命弱点
对称加密,就是加密和解密用同一把钥匙。你想想看,就像你家大门,进门出门都用同一把钥匙。常见的算法有 AES、DES、SM4。
我个人习惯在固件加密场景里首选 AES-128 或 AES-256。为什么?因为硬件加速器几乎都支持它,跑起来快,功耗也低。
| 算法 | 密钥长度 | 典型应用场景 |
|---|---|---|
| AES-128 | 128 bit | 固件存储加密、OTA 包加密 |
| AES-256 | 256 bit | 高安全等级设备、金融终端 |
| SM4 | 128 bit | 国密合规场景 |
非对称加密:公钥私钥,各司其职
非对称加密用一对钥匙:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,反过来私钥签名可以用公钥验证。常用的有 RSA、ECC、SM2。
在固件启动校验里,我通常用非对称加密来做签名验证。比如,固件发布前用私钥签名,设备启动时用公钥验签。这样即使固件被替换,签名对不上,系统直接拒绝启动。
核心区别:
- 对称加密:速度快,适合大量数据加密
- 非对称加密:速度慢,适合密钥交换和数字签名
你可能会问,那能不能只用非对称加密?嗯,理论上可以,但实际中没人这么干。因为非对称加密太慢了,加密一个 1MB 的固件可能要好几秒。所以实际做法是:用非对称加密保护对称密钥,再用对称密钥加密固件。这叫混合加密。
哈希函数:固件的指纹
哈希函数能把任意长度的数据,压缩成固定长度的摘要。常见的算法有 SHA-256、SHA-3、SM3。
哈希函数有个特点:不可逆。你没法从摘要反推出原始数据。而且,哪怕只改一个 bit,摘要都会完全不一样。
我在项目中常用哈希函数做完整性校验。比如,固件烧录前计算一次哈希值,烧录后再算一次,对比一下就知道固件有没有被篡改。
避坑指南:我曾经遇到过哈希碰撞攻击的案例。攻击者构造了两个不同的固件,但哈希值相同。所以现在我都推荐用 SHA-256 或更高强度的算法,别再碰 MD5 和 SHA-1 了。
消息认证码:防篡改 + 防伪造
哈希函数只能保证完整性,但没法验证消息来源。消息认证码(MAC)就是来解决这个问题的。它需要一个共享密钥,只有持有密钥的双方才能生成和验证 MAC。
常见的 MAC 算法有 HMAC-SHA256、CMAC。
举个例子:设备收到 OTA 固件包后,用预置的密钥计算 MAC,和固件包里带的 MAC 对比。如果一致,说明固件既没被篡改,也确实来自合法的服务器。
密钥管理基础:加密系统的命门
加密算法再强,密钥管理一塌糊涂,整个系统就是纸糊的。我见过太多项目,密钥直接明文存 Flash,或者用固定密钥加密密钥——这跟没加密一样。
密钥管理有几个基本原则:
- 密钥分级:根密钥、设备密钥、会话密钥,层层保护
- 安全存储:密钥放在安全元件(SE)或 TrustZone 里,别放普通 Flash
- 密钥生命周期:生成、分发、使用、更新、销毁,每个环节都要管
- 防侧信道攻击:别让功耗分析、电磁辐射把密钥泄露出去
我的经验:在量产时,每个设备都要有唯一的设备密钥。千万别所有设备用同一个密钥,否则一台被破解,全线崩溃。
知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到,对称加密、非对称加密、哈希函数、MAC 各自负责什么,以及它们如何协同工作。
实际项目中的选择建议
说了这么多,到底怎么选?我根据项目经验整理了一个对照表:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 固件存储加密 | AES-128 + 设备唯一密钥 | 速度快,密钥绑定设备 |
| OTA 固件升级 | RSA-2048 签名 + SHA-256 哈希 | 公钥验签,私钥在服务器端 |
| 设备间通信 | ECDH 密钥协商 + AES-GCM | 前向安全,防重放攻击 |
| 国密合规 | SM2 + SM3 + SM4 | 满足国内标准要求 |
个人建议:别自己造轮子。用成熟的加密库,比如 mbedTLS、OpenSSL、WolfSSL。这些库经过大量安全审计,比自己手写的靠谱得多。
好了,这一章的内容就到这里。加密基础打牢了,后面讲启动校验和固件保护时,你就能理解为什么每一步都要这么设计了。