3. 密码学基础回顾:哈希函数、非对称加密、数字签名、证书链
启动校验,说白了就是一套密码学组合拳。你想想看,系统怎么知道当前加载的固件是“真的”?怎么知道它没被篡改过?这背后依赖的,就是哈希、非对称加密、数字签名和证书链这几个老朋友。
我见过不少开发者在做安全启动时,把签名和加密搞混。嗯,这里我们先理清一个概念:签名不等于加密。签名是为了证明“谁写的”和“写完之后有没有被改过”,加密是为了不让别人看。启动校验里,我们几乎只用签名,不用加密。
3.1 哈希函数:数据的“指纹”
哈希函数,就是把任意长度的数据,映射成一个固定长度的摘要。这个摘要就像人的指纹——数据变了,指纹一定变。
我个人习惯把哈希函数比作“单向黑盒”。你给它一个文件,它吐出一串十六进制数。但你没法从这串数反推出原始文件。这就是单向性。
启动校验中哈希的用途:
- 校验固件完整性:计算当前固件的哈希值,跟出厂时记录的哈希值对比。
- 作为签名的对象:我们不直接对几百兆的固件签名,而是对它的哈希值签名,效率高得多。
常见的哈希算法有 SHA-256、SHA-384、SHA-512。SHA-1 已经被证明不安全,我在项目中遇到过客户还在用 SHA-1 做签名校验,结果被我们安全审计直接打了回去。现在业界底线是 SHA-256。
避坑指南: 我曾经接手过一个项目,固件升级时只校验了哈希值,但没校验签名。攻击者只要替换了固件和哈希值,就能绕过校验。记住:哈希只防意外篡改,不防恶意攻击。要防恶意攻击,必须配合数字签名。
3.2 非对称加密:公钥与私钥
非对称加密,就是有一对钥匙:公钥和私钥。公钥可以公开,私钥必须保密。用私钥签名的数据,只能用对应的公钥验证;用公钥加密的数据,只能用对应的私钥解密。
在启动校验里,我们只用它的签名/验签功能,不用加密功能。流程是这样的:
- 固件发布方用私钥对固件的哈希值签名,生成签名数据。
- 设备端用预置的公钥验证签名数据。
- 验证通过,说明固件确实是发布方签发的,且未被篡改。
常用的非对称算法有 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 数字签名:哈希 + 非对称加密的组合
数字签名,就是把哈希和非对称加密结合起来。流程如下:
- 对固件计算哈希值 H。
- 用私钥对 H 签名,得到签名值 S。
- 将固件和 S 一起发布。
- 设备端收到后,计算固件的哈希值 H'。
- 用公钥验证 S 是否是对 H' 的有效签名。
如果验证通过,说明固件确实是私钥持有者签发的,且内容没被改过。这就是启动校验的核心逻辑。
关键点: 数字签名保证了两个东西:
- 真实性: 数据确实来自声称的发布方。
- 完整性: 数据在传输过程中没有被篡改。
我在项目中遇到过一种情况:有人把签名和加密搞混,觉得“签名就是加密的逆过程”。其实不是。RSA 签名和 RSA 加密虽然数学上有关联,但用途完全不同。签名用的是私钥,验签用的是公钥;加密用的是公钥,解密用的是私钥。千万别搞反。
3.4 证书链:信任的传递
单靠一个公钥,怎么保证这个公钥就是发布方的?万一公钥被替换了呢?这就引出了证书链。
证书,就是把公钥和身份信息绑定在一起,并由一个可信的第三方(CA,证书颁发机构)签名。证书链,就是一层套一层的信任关系:
- 根证书: 自签名的,信任的起点。通常预置在设备 ROM 里。
- 中间证书: 由根证书签发,用于签发最终的设备证书或固件证书。
- 实体证书: 由中间证书签发,包含固件发布方的公钥。
验证流程是这样的:设备用预置的根证书公钥,验证中间证书的签名;再用中间证书的公钥,验证实体证书的签名;最后用实体证书的公钥,验证固件的签名。一层层往上追溯,直到信任的根。
我曾经帮一个客户设计安全启动方案,他们一开始想把所有设备的公钥都烧录在 ROM 里。我说不行,这样每换一次密钥就要换硬件。用证书链,只需要更新中间证书或实体证书,根证书不动,灵活得多。
实践建议: 证书链的层级不要太多,2-3 层就够了。层级太多,验证时间会变长,而且根证书一旦泄露,整个链都得重建。我一般建议:根证书 + 一个中间证书 + 实体证书,三层足矣。
3.5 小结:这些概念怎么用在启动校验里?
好了,我们把四个概念串起来,看看它们在启动校验中的角色:
| 概念 | 在启动校验中的角色 |
|---|---|
| 哈希函数 | 计算固件摘要,作为签名的对象 |
| 非对称加密 | 提供签名/验签能力,公钥预置在设备上 |
| 数字签名 | 保证固件的真实性和完整性 |
| 证书链 | 建立信任传递,解决公钥可信问题 |
这四者缺一不可。哈希是基础,非对称加密是工具,数字签名是方法,证书链是信任框架。后面的章节,我们会一步步深入,看看这些概念在硬件启动、固件加载、安全升级中是怎么落地的。