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 数字签名:信任的「封印」

数字签名,是非对称加密的经典应用。它解决了三个问题:

  • 完整性:数据有没有被篡改?
  • 真实性:数据是谁签发的?
  • 不可否认性:签发者不能抵赖。

它的流程是这样的:

  1. 签名方:对原始数据做哈希,得到摘要。然后用 私钥 对摘要加密,生成签名。
  2. 验签方:收到数据和签名后,用同样的哈希算法算出摘要。然后用 公钥 解密签名,得到另一个摘要。两个摘要对比,一致则通过。

在安全启动里,这个过程就是「信任链」的核心。

// 伪代码示例:签名与验签
// 签名(在安全的生产环境中进行)
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 知识体系总览

为了让你更直观地理解这三者之间的关系,我画了一张图。你可以把它看作安全启动的「密码学三件套」。

密码学基础与安全启动关系图 密码学三件套与安全启动 哈希算法 SHA-256 非对称加密 RSA / ECDSA 数字签名 完整性 + 真实性 哈希的作用 为固件生成唯一摘要 确保数据完整性 抗碰撞,防篡改 非对称加密的作用 公钥公开,私钥保密 用于签名和密钥交换 RSA 成熟,ECDSA 高效 数字签名的作用 验证固件来源真实性 防止固件被替换 信任链的基石 安全启动核心流程 固件 → SHA256 → 摘要 → RSA/ECDSA签名 → 签名固件

你看,这三者不是孤立的。哈希算法为数据生成「指纹」,非对称加密提供了「私钥封印」的能力,而数字签名把两者结合起来,形成了完整的信任凭证。

在后续的章节里,我们会看到这个「三件套」如何被嵌入到芯片的 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

亲手跑一遍,比看十遍书都管用。