3. 密码学基础回顾:哈希函数、非对称加密、数字签名、证书链

启动校验,说白了就是一套密码学组合拳。你想想看,系统怎么知道当前加载的固件是“真的”?怎么知道它没被篡改过?这背后依赖的,就是哈希、非对称加密、数字签名和证书链这几个老朋友。

我见过不少开发者在做安全启动时,把签名和加密搞混。嗯,这里我们先理清一个概念:签名不等于加密。签名是为了证明“谁写的”和“写完之后有没有被改过”,加密是为了不让别人看。启动校验里,我们几乎只用签名,不用加密。

3.1 哈希函数:数据的“指纹”

哈希函数,就是把任意长度的数据,映射成一个固定长度的摘要。这个摘要就像人的指纹——数据变了,指纹一定变。

我个人习惯把哈希函数比作“单向黑盒”。你给它一个文件,它吐出一串十六进制数。但你没法从这串数反推出原始文件。这就是单向性。

启动校验中哈希的用途:

  • 校验固件完整性:计算当前固件的哈希值,跟出厂时记录的哈希值对比。
  • 作为签名的对象:我们不直接对几百兆的固件签名,而是对它的哈希值签名,效率高得多。

常见的哈希算法有 SHA-256、SHA-384、SHA-512。SHA-1 已经被证明不安全,我在项目中遇到过客户还在用 SHA-1 做签名校验,结果被我们安全审计直接打了回去。现在业界底线是 SHA-256。

避坑指南: 我曾经接手过一个项目,固件升级时只校验了哈希值,但没校验签名。攻击者只要替换了固件和哈希值,就能绕过校验。记住:哈希只防意外篡改,不防恶意攻击。要防恶意攻击,必须配合数字签名。

3.2 非对称加密:公钥与私钥

非对称加密,就是有一对钥匙:公钥和私钥。公钥可以公开,私钥必须保密。用私钥签名的数据,只能用对应的公钥验证;用公钥加密的数据,只能用对应的私钥解密。

在启动校验里,我们只用它的签名/验签功能,不用加密功能。流程是这样的:

  1. 固件发布方用私钥对固件的哈希值签名,生成签名数据。
  2. 设备端用预置的公钥验证签名数据。
  3. 验证通过,说明固件确实是发布方签发的,且未被篡改。

常用的非对称算法有 RSA、ECDSA、Ed25519。RSA 比较成熟,但密钥长度长(2048位起步),计算慢。ECDSA 用椭圆曲线,密钥短(256位就够),性能好。我个人更倾向 ECDSA,尤其是在嵌入式设备上,资源有限,能省则省。

算法 密钥长度 签名速度 验签速度 典型场景
RSA-2048 2048 bit 慢 快 PC、服务器
ECDSA-P256 256 bit 快 快 嵌入式、IoT
Ed25519 256 bit 极快 极快 新兴安全启动

注意: 公钥存储在设备上,一旦被篡改,整个信任体系就崩塌了。所以公钥必须放在只读存储器(如 ROM、OTP)里,或者由更高级别的密钥保护。这就是证书链要解决的问题。

3.3 数字签名:哈希 + 非对称加密的组合

数字签名,就是把哈希和非对称加密结合起来。流程如下:

  1. 对固件计算哈希值 H。
  2. 用私钥对 H 签名,得到签名值 S。
  3. 将固件和 S 一起发布。
  4. 设备端收到后,计算固件的哈希值 H'。
  5. 用公钥验证 S 是否是对 H' 的有效签名。

如果验证通过,说明固件确实是私钥持有者签发的,且内容没被改过。这就是启动校验的核心逻辑。

关键点: 数字签名保证了两个东西:

  • 真实性: 数据确实来自声称的发布方。
  • 完整性: 数据在传输过程中没有被篡改。

我在项目中遇到过一种情况:有人把签名和加密搞混,觉得“签名就是加密的逆过程”。其实不是。RSA 签名和 RSA 加密虽然数学上有关联,但用途完全不同。签名用的是私钥,验签用的是公钥;加密用的是公钥,解密用的是私钥。千万别搞反。

3.4 证书链:信任的传递

单靠一个公钥,怎么保证这个公钥就是发布方的?万一公钥被替换了呢?这就引出了证书链。

证书,就是把公钥和身份信息绑定在一起,并由一个可信的第三方(CA,证书颁发机构)签名。证书链,就是一层套一层的信任关系:

  • 根证书: 自签名的,信任的起点。通常预置在设备 ROM 里。
  • 中间证书: 由根证书签发,用于签发最终的设备证书或固件证书。
  • 实体证书: 由中间证书签发,包含固件发布方的公钥。

验证流程是这样的:设备用预置的根证书公钥,验证中间证书的签名;再用中间证书的公钥,验证实体证书的签名;最后用实体证书的公钥,验证固件的签名。一层层往上追溯,直到信任的根。

我曾经帮一个客户设计安全启动方案,他们一开始想把所有设备的公钥都烧录在 ROM 里。我说不行,这样每换一次密钥就要换硬件。用证书链,只需要更新中间证书或实体证书,根证书不动,灵活得多。

证书链信任传递流程 根证书(自签名) 中间证书 实体证书(固件公钥) 固件 + 签名 预置在设备 ROM 信任的锚点 由根证书签发 可在线更新 由中间证书签发 包含固件发布方公钥

实践建议: 证书链的层级不要太多,2-3 层就够了。层级太多,验证时间会变长,而且根证书一旦泄露,整个链都得重建。我一般建议:根证书 + 一个中间证书 + 实体证书,三层足矣。

3.5 小结:这些概念怎么用在启动校验里?

好了,我们把四个概念串起来,看看它们在启动校验中的角色:

概念 在启动校验中的角色
哈希函数 计算固件摘要,作为签名的对象
非对称加密 提供签名/验签能力,公钥预置在设备上
数字签名 保证固件的真实性和完整性
证书链 建立信任传递,解决公钥可信问题

这四者缺一不可。哈希是基础,非对称加密是工具,数字签名是方法,证书链是信任框架。后面的章节,我们会一步步深入,看看这些概念在硬件启动、固件加载、安全升级中是怎么落地的。