1. 签名链基础概念
各位同学好,我是老周。做固件安全这些年,我见过太多因为签名链没搞明白而翻车的案例。今天咱们就从最基础的东西聊起——数字签名、哈希函数、PKI,还有固件签名链到底是个啥。
1.1 数字签名:给固件盖个章
数字签名,说白了就是电子版的「盖章+封条」。你想想看,古代皇帝批奏折要盖玉玺,现代人签合同要按手印。数字签名干的是同一件事——证明这份固件是谁签发的,而且中途没被人动过手脚。
我刚开始做嵌入式安全时,有个客户问我:「我把固件放U盘里拷过去,不就行了吗?」嗯,后来他的产品被人在固件里植入了后门,整批货都废了。从那以后,他再也不敢问这种问题了。
数字签名的工作原理其实不复杂:
- 签名过程:用私钥对固件的哈希值加密,生成签名
- 验证过程:用公钥解密签名,比对哈希值是否一致
核心要点:私钥必须绝对保密,公钥可以公开。谁拿到公钥都能验证签名,但只有私钥持有者才能签名。
1.2 哈希函数:固件的「指纹」
哈希函数,你可以把它理解成给固件提取指纹。不管你的固件是1KB还是1GB,哈希函数都能算出一个固定长度的摘要——通常是256位或512位。
哈希函数有几个关键特性:
- 单向性:从哈希值推不出原始数据,就像从指纹推不出人的长相
- 抗碰撞性:几乎不可能找到两个不同的固件有相同的哈希值
- 雪崩效应:改一个比特,哈希值就面目全非
我在项目中遇到过一件事:有个同事把固件里的版本号从1.0改成1.1,然后问我为什么签名验证失败了。我告诉他——哈希函数可不管你是改版本号还是改代码,只要变了,哈希值就变了,签名自然就失效了。
避坑指南:我曾经见过有人直接用MD5做固件签名验证。MD5已经被攻破了,千万别用。现在业界标准是SHA-256或SHA-512。
1.3 公钥基础设施(PKI):信任的链条
PKI,全称是Public Key Infrastructure。名字听着高大上,其实就是一个「信任传递系统」。
你想想看:你拿到一个公钥,怎么知道这个公钥真的是设备厂商的?万一被人掉包了呢?PKI就是解决这个问题的——通过证书链,把信任从根证书一层层传递下去。
PKI的核心组件:
| 组件 | 作用 | 我见过的坑 |
|---|---|---|
| 根CA | 信任的起点,自签名证书 | 根证书私钥泄露,整个体系完蛋 |
| 中间CA | 承接根CA,签发下级证书 | 有人跳过中间CA直接签,证书链断了 |
| 终端证书 | 实际用于签名的证书 | 证书过期了还在用,验证失败 |
| CRL/OCSP | 证书吊销状态查询 | 嵌入式设备没联网,查不了吊销状态 |
1.4 固件签名链的定义与价值
固件签名链,就是把上面这些东西串起来——从BootROM到Bootloader,再到固件镜像,每一级都验证上一级的签名。形成一个完整的信任链条。
为什么需要签名链?我给你讲个真实案例:
有一次,我帮一家IoT厂商做安全审计。他们的设备只有BootROM验签,Bootloader和固件之间没有签名验证。攻击者做了什么?他逆向出Bootloader的接口,直接刷了一个修改过的固件进去。设备照样能启动,但固件里已经被植入了挖矿程序。
这就是典型的「信任链断裂」。签名链的价值就在于:
- 完整性:确保固件从出厂到运行,没被篡改过
- 真实性:确保固件来自可信的厂商,不是第三方伪造的
- 可追溯:出了问题能追查到是哪个环节被攻破了
警告:签名链的强度取决于最弱的一环。我曾经见过一个产品,签名算法用的是RSA-2048,看起来很安全。但它的私钥存在一个没有加密的配置文件里……嗯,你懂的。
1.5 签名链的完整流程
下面这张图展示了固件签名链的完整流程。我建议你仔细看看,后面所有章节都是围绕这个流程展开的。
1.6 签名链的层级结构
一个完整的固件签名链,通常包含以下几个层级:
- BootROM:芯片出厂时固化,验证下一级Bootloader的签名
- Bootloader:验证固件镜像的签名
- 固件镜像:包含应用程序、文件系统等
- 更新包:OTA升级时,验证更新包的签名
每一级都只信任上一级签发的证书。这就是「链」的含义——环环相扣,缺一不可。
记住:签名链不是可选项,而是嵌入式安全的基础设施。没有签名链,你的设备就像没上锁的门——谁都能进。
1.7 小结
这一章我们聊了数字签名、哈希函数、PKI和固件签名链的基本概念。这些东西看起来简单,但实际落地时坑很多。我见过太多人把签名链当成「加个签名就完事」,结果漏洞百出。