3、密码学基础:哈希算法(SHA256)、非对称加密(RSA/ECC)、数字签名原理
各位好,我是老周。今天咱们聊点硬核的——密码学基础。别被这名字吓到,说白了,安全启动的整个信任链,就是靠这几个算法撑起来的。我做了这么多年嵌入式安全,见过太多因为密码学选型翻车的案例。嗯,咱们一个一个来拆解。
3.1 哈希算法:数据的“指纹”
哈希算法,你可以把它想象成给数据盖个章。不管输入是一行代码还是一张照片,它都能给你算出一个固定长度的摘要。这个摘要,就是数据的“指纹”。
我个人最常用的哈希算法是 SHA256。为什么是它?因为它的输出是 256 位,也就是 32 个字节。这个长度在安全性和性能之间取得了很好的平衡。
SHA256 的核心特性:
- 单向性:从摘要反推原始数据,几乎不可能。我试过暴力破解,算到天荒地老。
- 抗碰撞性:找到两个不同数据,但摘要相同,概率极低。理论上存在,但现实中你碰不到。
- 雪崩效应:输入改一个比特,输出会有一半以上的比特发生变化。这特性在检测篡改时特别好用。
在安全启动里,我们通常用 SHA256 来校验固件的完整性。比如,你烧录固件时,先算一个哈希值存起来。下次启动时,再算一遍,对比一下。不一样?那说明固件被人动过手脚了。
避坑指南:我曾经在一个项目里,看到有人用 MD5 做固件校验。MD5 已经被证明有碰撞漏洞了,攻击者可以构造一个恶意固件,但哈希值跟原版一样。这等于给攻击者留了后门。所以,别再用 MD5 了,至少用 SHA256。
3.2 非对称加密:公钥与私钥的“双人舞”
非对称加密,跟咱们平时用的对称加密不一样。对称加密就像一把钥匙开一把锁,加密解密用同一个密钥。而非对称加密,用的是两把钥匙:公钥和私钥。
公钥可以公开,谁都能拿到。私钥必须保密,只有你自己知道。这两把钥匙是配对的,用公钥加密的数据,只能用私钥解密;反过来,用私钥加密的数据,只能用公钥解密。
在嵌入式领域,最主流的非对称加密算法是 RSA 和 ECC。
| 特性 | RSA | ECC |
|---|---|---|
| 安全性基础 | 大整数分解 | 椭圆曲线离散对数 |
| 密钥长度 | 2048 位起 | 256 位起 |
| 计算速度 | 慢(尤其私钥操作) | 快 |
| 资源消耗 | 高 | 低 |
| 典型应用 | 数字签名、密钥交换 | 数字签名、密钥交换 |
你看,ECC 在同等安全强度下,密钥长度更短,计算更快。这对资源受限的嵌入式设备来说,简直是福音。我个人习惯,新项目优先考虑 ECC,尤其是 P-256 曲线。
注意:RSA 虽然老,但生态成熟。很多安全芯片和 BootROM 都内置了 RSA 加速引擎。如果你的硬件只支持 RSA,那就别硬上 ECC,否则软件实现会拖慢启动速度。我踩过这个坑,后来老老实实用了 RSA。
3.3 数字签名:给固件“上锁”
数字签名,是非对称加密的经典应用。它的作用,就是证明一段数据确实来自某个实体,并且没有被篡改过。
签名过程是这样的:
- 发送方对固件计算哈希值。
- 发送方用私钥对这个哈希值进行加密,得到签名。
- 发送方把固件和签名一起发给接收方。
验签过程是这样的:
- 接收方收到固件和签名。
- 接收方用公钥解密签名,得到哈希值 A。
- 接收方对固件计算哈希值 B。
- 对比 A 和 B。如果一致,说明固件是完整的,且来自私钥持有者。
在安全启动里,这个流程就是信任链的基石。BootROM 里固化了公钥,它用这个公钥去验签下一级 Bootloader 的签名。验签通过,才加载执行。这样一级一级传递信任,直到操作系统。
核心逻辑:数字签名 = 哈希算法 + 非对称加密。哈希保证完整性,非对称加密保证真实性。两者缺一不可。
3.4 知识体系图:密码学在安全启动中的位置
下面这张图,是我自己画的。它把咱们刚才讲的内容串起来了。你仔细看看,就能明白这些算法在安全启动里是怎么配合的。
3.5 实战中的选择建议
说了这么多,到底该怎么选?我根据经验,给你几个建议:
- 哈希算法:无脑选 SHA256。别问为什么,问就是安全、成熟、够用。
- 非对称加密:如果硬件支持 ECC,优先用 ECC P-256。如果硬件只支持 RSA,那就用 RSA 2048 位以上。
- 数字签名:签名算法要和哈希算法配套。比如,用 ECDSA 签名时,哈希用 SHA256。别混搭,容易出问题。
个人经验:我做过一个项目,芯片只有 64KB Flash,跑 RSA 2048 位签名,验签一次要 3 秒。后来换成 ECC P-256,验签时间降到 0.5 秒。启动速度直接起飞。所以,硬件选型时,一定要考虑密码学算法的性能。
好了,这一章的内容就到这。密码学是安全启动的根基,理解透了,后面讲信任链、安全存储、防回滚这些,你就能轻松跟上。咱们下章见。