3、密码学基础回顾:哈希函数、非对称加密、数字签名、证书链在信任链中的作用
说实话,很多做嵌入式或者 IoT 的工程师,一听到「密码学」三个字就头疼。我当年也一样。
但做设备信任链,你绕不开这些东西。它们不是理论,是实实在在的工程工具。说白了,信任链的每一环,都靠这些密码学原语撑着。
这一节,我们快速过一遍。不扯数学公式,只讲它们在信任链里到底干嘛用。
3.1 哈希函数:信任链的「指纹」
哈希函数,你肯定听过。SHA-256、SHA-384,这些是信任链里最常用的。
它的核心作用就一个:给数据打指纹。不管输入多大,输出固定长度。而且,哪怕改一个比特,指纹就完全变了。
信任链里的典型场景:
- 固件镜像的哈希值,用来校验完整性。
- 启动过程中,前一阶段计算后一阶段的哈希,比对是否被篡改。
- 数字签名里,先对消息哈希,再对哈希签名。
我在项目里遇到过一件事。有个同事把固件哈希存在了明文配置文件里。嗯,这等于没存。攻击者改了固件,顺手把哈希也改了。所以哈希值必须放在安全存储里,或者用签名保护起来。
工程建议: 信任链里优先用 SHA-256 或 SHA-384。SHA-1 已经不安全了,别再用。MD5?忘掉它。
3.2 非对称加密:信任链的「钥匙对」
非对称加密,就是公钥和私钥。私钥自己藏着,公钥发出去。
在信任链里,非对称加密主要干两件事:身份认证和密钥协商。
你想想看,设备第一次上电,谁都不认识谁。怎么建立信任?靠的就是非对称加密。设备用私钥签名,服务器用公钥验签。反过来也一样。
| 角色 | 持有密钥 | 信任链中的作用 |
|---|---|---|
| 设备 | 私钥(安全存储) | 签名启动度量值、证明身份 |
| 服务器/验证方 | 公钥(预置或证书) | 验签、确认设备合法性 |
| CA 根 | 根私钥(离线保护) | 签发下级证书 |
注意: 设备私钥一旦泄露,信任链就断了。所以私钥必须放在硬件安全模块(HSM)或安全元件(SE)里。纯软件存储?我见过太多被提 root 权限后直接读走的案例。
3.3 数字签名:信任链的「封条」
数字签名 = 哈希 + 非对称加密。
流程很简单:发送方对消息哈希,然后用私钥加密这个哈希。接收方用公钥解密,再自己算一遍哈希。比对一致,说明消息没被改,而且确实是私钥持有者发的。
在信任链里,数字签名无处不在:
- 固件包签名,设备升级时验签。
- 启动过程中,每个阶段对下一阶段的镜像签名。
- 设备向服务器发送证明报告时,附上签名。
我曾经踩过一个坑。验签时只检查了签名格式,没检查签名内容是否过期。结果一个旧版本的签名被重放攻击利用了。所以验签一定要检查签名有效期和撤销状态。
一句话总结: 哈希保证完整性,签名保证完整性和真实性。两者结合,就是信任链的「封条」。
3.4 证书链:信任链的「传递」
单个签名好理解。但设备成千上万,每个设备都预置一个公钥?不现实。
证书链解决了这个问题。它让信任可以传递。
结构是这样的:
- 根 CA:自签名证书,信任的起点。根私钥必须离线、物理隔离。
- 中间 CA:由根 CA 签发,用来分担风险。根 CA 不用天天在线。
- 设备证书:由中间 CA 签发,每个设备一个。里面包含设备的公钥和身份信息。
验证的时候,从设备证书开始,逐级向上,直到信任的根证书。每一级都要验签。只要根证书是可信的,整条链就可信。
下面这张图,就是证书链的典型结构:
工程实践: 设备端只存根证书的公钥。中间 CA 和设备证书可以在运行时下发。这样根私钥永远不用暴露。我见过一些方案把整条证书链都烧死在设备里,灵活性太差,证书轮换时很痛苦。
3.5 它们在信任链中的协作关系
这四个东西不是孤立的。它们组合起来,才构成完整的信任链。
举个例子,设备安全启动流程:
- BootROM 里预置了根 CA 的公钥。
- BootROM 加载下一级 Bootloader,先验签。验签过程:用根公钥验证 Bootloader 证书的合法性,再用 Bootloader 证书里的公钥验证 Bootloader 镜像的签名。
- Bootloader 再加载内核,同样流程。每一级都验签。
- 内核启动后,验证系统服务和应用的签名。
你看,哈希、签名、证书链,全用上了。每一级都信任上一级,上一级保护下一级。这就是信任链的核心逻辑。
核心要点:
- 哈希:保证数据没被改。
- 非对称加密:提供密钥对,一个签名,一个验签。
- 数字签名:哈希 + 私钥加密,保证完整性和真实性。
- 证书链:让信任可以传递,解决大规模部署的密钥分发问题。
嗯,基础就这些。后面几章,我们会把这些东西一个一个搭起来,做成真正的设备信任链。到时候你会发现,理解了这些原语,剩下的就是工程细节了。