4. 密码学基础回顾:哈希算法(SHA256)、非对称加密(RSA/ECDSA)、数字签名原理
各位同学,咱们今天聊点硬核的。安全启动这玩意儿,说白了就是一场「信任的接力赛」。而这场接力赛的每一棒,都离不开密码学。我做了这么多年嵌入式安全,见过太多因为密码学基础不牢,导致整个安全体系崩塌的项目。
所以,咱们花一章时间,把几个核心概念彻底捋清楚。别嫌基础,你想想看,地基不稳,楼盖得再高也是危房。
4.1 哈希算法:数据的「指纹」
哈希算法,也叫散列函数。它的作用很简单:给任意长度的数据,算出一个固定长度的「摘要」。这个摘要,就像人的指纹一样,具有唯一性。
在安全启动里,我们最常用的是 SHA-256。它会把你的固件、镜像,变成一串 256 位(32 字节)的哈希值。
核心特性:
- 单向性:从哈希值反推原始数据,理论上不可能。你只能正向算,不能逆向解。
- 抗碰撞性:找到两个不同数据,但哈希值相同,几乎不可能。SHA-256 的碰撞概率,比你在路上被陨石砸中还低。
- 雪崩效应:原始数据改一个比特,哈希值就会面目全非。
我在一个项目里遇到过,有人想用 MD5 做固件校验。我当时就急了,MD5 早就被证明有碰撞风险了。我建议他,别省那点算力,老老实实上 SHA-256。后来他听了,果然在后续的渗透测试中,MD5 方案被轻松攻破,而 SHA-256 稳如泰山。
我的习惯: 在代码里,我通常会用 OpenSSL 或者 mbedTLS 的 SHA-256 接口。但要注意,有些低端 MCU 没有硬件加速,纯软件算 SHA-256 会吃掉不少 CPU 时间。这时候,我会考虑用硬件哈希引擎,或者优化算法实现。
4.2 非对称加密:公钥与私钥的「双人舞」
对称加密,就像一把钥匙开一把锁。但问题来了,这把钥匙怎么安全地交给对方?非对称加密解决了这个世纪难题。
它使用一对密钥:公钥 和 私钥。公钥可以公开,私钥必须保密。用公钥加密的数据,只能用私钥解密;反之亦然。
在安全启动领域,我们主要用两种算法:RSA 和 ECDSA。
| 特性 | RSA | ECDSA (椭圆曲线) |
|---|---|---|
| 安全性基础 | 大整数分解难题 | 椭圆曲线离散对数难题 |
| 密钥长度 | 2048 / 4096 位 | 256 / 384 位 |
| 签名速度 | 较慢 | 较快 |
| 验签速度 | 较快 | 较慢 |
| 资源消耗 | 高(尤其私钥操作) | 低 |
你可能会问,为什么安全启动里,我们只用非对称加密来做签名和验签,而不是加密数据?
原因很简单:验签只需要公钥。公钥可以明文存储在芯片的 OTP 或 eFuse 里,不怕被看到。而私钥,永远留在产线或 HSM(硬件安全模块)里,永远不会进入设备。
我曾经踩过的坑: 有一次,我把 RSA 私钥不小心编译进了固件里。虽然固件是加密的,但一旦被破解,私钥就暴露了。那意味着整个产品线的信任链都断了。从那以后,我定了一条铁律:私钥永远不能出现在任何代码或镜像中。它必须物理隔离。
4.3 数字签名:信任的「封印」
数字签名,是非对称加密的经典应用。它解决了三个问题:
- 完整性:数据有没有被篡改?
- 真实性:数据是谁签发的?
- 不可否认性:签发者不能抵赖。
它的流程是这样的:
- 签名方:对原始数据做哈希,得到摘要。然后用 私钥 对摘要加密,生成签名。
- 验签方:收到数据和签名后,用同样的哈希算法算出摘要。然后用 公钥 解密签名,得到另一个摘要。两个摘要对比,一致则通过。
在安全启动里,这个过程就是「信任链」的核心。
// 伪代码示例:签名与验签
// 签名(在安全的生产环境中进行)
hash = SHA256(firmware_image);
signature = RSA_Sign(private_key, hash);
// 验签(在设备启动时进行)
hash = SHA256(firmware_image);
is_valid = RSA_Verify(public_key, hash, signature);
if (is_valid) {
// 启动固件
} else {
// 拒绝启动,进入恢复模式
}
嗯,这里要注意,实际项目中,我们不会直接对固件签名,而是对固件的哈希值签名。因为固件可能很大,非对称加密算起来太慢。先哈希,再签名,效率高得多。
4.4 知识体系总览
为了让你更直观地理解这三者之间的关系,我画了一张图。你可以把它看作安全启动的「密码学三件套」。
你看,这三者不是孤立的。哈希算法为数据生成「指纹」,非对称加密提供了「私钥封印」的能力,而数字签名把两者结合起来,形成了完整的信任凭证。
在后续的章节里,我们会看到这个「三件套」如何被嵌入到芯片的 BootROM 中,形成一条从硬件到应用层的信任链。你想想看,如果连这些基础都不懂,后面怎么去理解 TPM、TEE、安全启动策略?
我的建议: 如果你现在手头有开发板,不妨写个小程序,用 OpenSSL 命令行工具,亲自体验一下:
# 生成 RSA 密钥对
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
# 对固件签名
openssl dgst -sha256 -sign private.pem -out firmware.sig firmware.bin
# 验签
openssl dgst -sha256 -verify public.pem -signature firmware.sig firmware.bin
亲手跑一遍,比看十遍书都管用。