密码学基础(上):对称加密与非对称加密、哈希函数、数字签名原理
各位同学,欢迎来到《固件签名联调实战指南》的第二章。说实话,密码学这玩意儿,刚接触时容易觉得抽象,一堆数学公式看得人头疼。但咱们做固件安全的,不把这层窗户纸捅破,后面联调签名验证时就会处处碰壁。
这一章,我带你从工程视角捋一遍核心概念。不扯太深的理论,重点讲清楚:加密、哈希、签名这三兄弟到底是干嘛的,以及它们怎么配合起来保护你的固件。
1. 对称加密 vs 非对称加密
先聊加密。加密的目的很简单——把数据变成别人看不懂的密文。但怎么加密,用什么钥匙,这里就有讲究了。
1.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一把密钥。你想想看,就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。
常见的对称加密算法有 AES(Advanced Encryption Standard),密钥长度可以是 128、192 或 256 位。在固件领域,AES-128 用得最多,性能和安全性比较均衡。
核心特点:
- 速度快,适合加密大量数据(比如整个固件镜像)
- 密钥管理是痛点——怎么安全地把密钥传给对方?
我在项目中遇到过一个问题:用 AES 加密固件后,把密钥硬编码在 Bootloader 里。结果产品被破解后,攻击者直接读出了 Flash 中的密钥,所有加密固件形同虚设。嗯,这里要注意——对称加密的密钥分发,永远是最大的短板。
1.2 非对称加密:公钥私钥配对用
非对称加密就聪明多了。它有一对密钥:公钥(Public Key) 和 私钥(Private Key)。公钥可以公开,私钥必须保密。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥加密的数据,也只有对应的公钥能解开。
常见的算法有 RSA 和 ECC(椭圆曲线密码学)。在固件签名场景里,ECC 因为密钥短、性能好,越来越受欢迎。
| 特性 | 对称加密(AES) | 非对称加密(RSA/ECC) |
|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥 + 私钥) |
| 加密速度 | 快(硬件加速常见) | 慢(比 AES 慢 100-1000 倍) |
| 密钥分发 | 困难 | 公钥可公开,私钥本地保管 |
| 典型用途 | 加密大量数据 | 数字签名、密钥交换 |
我的建议:实际项目中,很少直接用非对称加密去加密整个固件。太慢了。通常的做法是:用非对称加密保护对称密钥,再用对称密钥加密固件。这叫「混合加密」,后面联调时会用到。
2. 哈希函数:数据的「指纹」
哈希函数,你可以把它想象成给数据算一个「指纹」。不管输入多大,输出都是固定长度。而且,哪怕只改一个比特,算出来的哈希值也完全不同。
在固件签名里,我们常用的是 SHA-256 和 SHA-384。
- SHA-256:输出 256 位(32 字节),安全性够用,性能好。我大部分项目都用它。
- SHA-384:输出 384 位(48 字节),安全性更高,但计算量也大一些。一些对安全等级要求极高的场景(比如车规级固件)会选它。
避坑指南:我曾经踩过一个坑——用 MD5 做固件完整性校验。MD5 只有 128 位,而且已经被证明存在碰撞攻击。攻击者可以构造两个不同的固件,但 MD5 值相同。从那以后,我所有项目都强制要求至少 SHA-256。别图省那点性能,安全无小事。
哈希函数有个重要特性:不可逆。你没法从哈希值反推出原始数据。这个特性在数字签名里至关重要——我们后面会用到。
3. 数字签名原理:RSA 与 ECDSA
数字签名,是固件安全的基石。它的核心目标是:证明固件是谁签的,以及固件有没有被篡改。
3.1 签名流程(以 RSA 为例)
我习惯把签名过程拆成三步:
- 计算哈希:对固件镜像算一个 SHA-256 哈希值。
- 私钥加密哈希:用签名者的私钥对这个哈希值进行加密(实际是签名算法,但原理类似)。加密后的结果就是「数字签名」。
- 打包分发:把固件 + 数字签名 + 公钥(或公钥证书)一起发给设备。
验证过程反过来:
- 设备收到固件后,自己算一遍 SHA-256 哈希。
- 用公钥解密数字签名,得到原始的哈希值。
- 对比两个哈希值。如果一致,说明固件没被改过,而且确实是持有私钥的人签的。
关键点:数字签名不是加密整个固件,而是加密固件的哈希值。这样既保证了效率(只加密 32 字节),又保证了安全性(哈希值变了,签名就失效)。
3.2 RSA vs ECDSA
RSA 和 ECDSA 是两种最主流的签名算法。我简单对比一下:
| 对比项 | RSA | ECDSA(椭圆曲线) |
|---|---|---|
| 密钥长度 | 2048 / 4096 位 | 256 / 384 位 |
| 签名速度 | 慢(私钥操作) | 快 |
| 验证速度 | 快(公钥操作) | 较快 |
| 签名大小 | 256 / 512 字节 | 64 / 96 字节 |
| 安全性 | 成熟,但需要长密钥 | 同等安全下密钥更短 |
我个人习惯:如果设备资源紧张(比如 Cortex-M0 芯片),优先选 ECDSA。签名小,传输快,验证也快。RSA 在 PC 端或服务器端用得更多,因为兼容性好,生态成熟。
一个小经验:ECDSA 的随机数生成非常关键。如果随机数质量差,或者重复使用了随机数,私钥可能被推导出来。我曾经见过一个产品因为随机数生成器初始化没做好,导致签名被破解。所以,用 ECDSA 时,一定要确保硬件随机数发生器(TRNG)正常工作。
4. 知识体系总览
下面这张图,把这一章的核心逻辑串起来了。你可以把它当作一个「密码学工具箱」:
5. 小结:这些概念怎么串起来?
好了,这一章的内容就这些。你可能会问:学了这些,跟固件签名联调有什么关系?
关系大了。我简单剧透一下后面的套路:
- 哈希函数用来给固件算「指纹」
- 非对称加密(私钥)用来给这个「指纹」签名
- 非对称加密(公钥)用来在设备端验证签名
- 对称加密用来加密固件本身(如果需要保密)
下一章,我们会把这些概念落地到代码里,手写一个固件签名工具。到时候你会发现,理解了原理,写代码就是水到渠成的事。
最后提醒一句:密码学算法本身是安全的,但实现细节往往出问题。密钥存储、随机数生成、侧信道攻击……这些才是实战中的硬骨头。后面的章节,我会结合具体案例,一个一个帮你踩平。