密码学基础回顾(上):对称加密与非对称加密的区别,哈希函数的特性
做固件安全,说白了就是跟密钥和算法打交道。我见过不少团队,上来就撸代码实现验签,结果连最基本的加密概念都没搞清楚,最后踩坑踩到怀疑人生。这一章咱们把密码学基础捋一遍,重点说清楚三件事:对称加密、非对称加密、哈希函数。这些是固件验签的基石,绕不过去。
对称加密:一把钥匙开一把锁
对称加密,顾名思义,加密和解密用的是同一把密钥。就像你家的门锁,用同一把钥匙锁门、开门。
我刚开始做嵌入式时,觉得对称加密挺简单的。直到有一次,我在一个IoT设备里用AES-128加密固件分区,密钥硬编码在代码里。结果产品上市不到两周,就被黑客用JTAG把固件dump出来,密钥直接暴露。嗯,从那以后我再也不敢把密钥明文放固件里了。
核心特点:
- 速度快:硬件加速下,AES-128加解密能达到Gbps级别,适合大量数据
- 密钥管理难:通信双方必须共享同一密钥,分发过程容易被截获
- 典型算法:AES、DES(已淘汰)、SM4(国密)
在固件验签场景里,对称加密用得不多。为什么?因为你要把密钥分发给所有设备,一旦某个设备被攻破,密钥就泄露了,整个产品线都得遭殃。你想想看,这风险谁扛得住?
非对称加密:公钥私钥,各司其职
非对称加密就不一样了。它有一对密钥:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,反过来,私钥签名的数据只能用公钥验证。
这玩意儿在固件验签里是主角。我参与过一个车载ECU的OTA项目,固件包就是用RSA-2048签名的。设备端只存公钥,私钥放在厂家的HSM(硬件安全模块)里。就算黑客把设备拆了,拿到公钥也没用——他伪造不了签名。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个(共享密钥) | 2个(公钥+私钥) |
| 加解密速度 | 快(硬件加速可达Gbps) | 慢(RSA-2048约几千次/秒) |
| 密钥分发 | 困难,需要安全通道 | 公钥可公开,私钥自留 |
| 典型用途 | 数据加密传输 | 数字签名、密钥交换 |
| 固件验签适用性 | 低(密钥泄露风险高) | 高(公钥验签,私钥安全) |
不过非对称加密也有短板——慢。RSA-2048签名一次,在普通MCU上可能要几百毫秒。所以实际工程里,我们通常不会直接用非对称加密去加密整个固件,而是用它来签名固件的哈希值。这个后面会细讲。
哈希函数:数据的指纹
哈希函数,你可以把它理解成数据的「指纹」。不管输入是一段文字还是一个10MB的固件,哈希函数都会输出一个固定长度的摘要(比如SHA-256输出32字节)。
哈希函数有两个核心特性,做固件安全必须吃透:
1. 单向性
从哈希值反推原始数据,理论上是不可能的。你想想看,SHA-256的输出只有256位,但输入可以是任意长度。信息量压缩了,就不可能无损还原。我在项目中见过有人试图「解密」哈希值,这完全是误解——哈希不是加密,它没有解密过程。
2. 抗碰撞性
找到两个不同的输入,让它们的哈希值相同,这在计算上是不可行的。SHA-256的抗碰撞强度是128位,什么意思?就是你要尝试2^128次才能找到一对碰撞。以现在的算力,这比中彩票还难。
注意:MD5和SHA-1已经被证明存在实际碰撞攻击。我曾经审计过一个老项目,固件验签用的还是MD5,结果用现成的工具几分钟就伪造出了碰撞。赶紧换SHA-256,别犹豫。
固件验签中的哈希应用
哈希函数在固件验签里扮演两个角色:
- 完整性校验:计算固件的哈希值,跟官方发布的哈希对比,看固件有没有被篡改
- 签名对象:对固件的哈希值做签名,而不是对固件本身。因为哈希值很短(32字节),签名速度快得多
我个人习惯的做法是:先用SHA-256计算固件的哈希,然后用RSA私钥对这个哈希签名。设备端收到固件后,同样计算哈希,再用公钥验证签名。这样既保证了完整性,又保证了真实性。
知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到对称加密、非对称加密、哈希函数在固件验签中的位置和关系。
小技巧:在资源受限的MCU上,如果RSA验签太慢,可以考虑用ECDSA。同样的安全强度下,ECDSA的密钥更短,验签速度也更快。我在一个Cortex-M0的项目里,用ECDSA P-256把验签时间从800ms降到了120ms。
好了,这一章的基础就到这里。对称加密、非对称加密、哈希函数,这三者的区别和用途,是后面所有工程化落地的前提。你把这些概念吃透了,后面讲签名流程、密钥管理、防回滚这些实战内容时,才能跟得上节奏。