一、固件签名概述
什么是固件签名?
固件签名,说白了就是给固件打个「数字指纹」。
我刚开始接触这个领域时,觉得签名就是个加密过程。后来踩了坑才明白——签名不是加密,它是「身份证明」。
打个比方:你收到一个快递,包装上贴着发货人的签名和印章。你确认这个签名是真的,才敢拆包用。固件签名干的就是这事。
具体来说,固件签名包含三个要素:
- 签名者身份——谁签的?是厂商还是第三方?
- 固件完整性——固件有没有被篡改过?
- 不可抵赖性——签了就不能说「我没签过」
技术实现上,通常用非对称加密算法。私钥在厂商手里,公钥烧在设备里。设备启动时,用公钥验证固件上的签名。匹配就启动,不匹配就罢工。
核心逻辑:固件签名 = 哈希摘要 + 私钥加密。不是把整个固件加密,而是对固件的「指纹」做签名。
为什么需要固件签名?
这个问题我问过很多刚入行的朋友。他们的第一反应是「防病毒」。嗯,对了一半。
我在一个物联网项目里遇到过真实案例:某款智能门锁,固件没签名。黑客通过OTA升级通道,塞了个恶意固件进去。结果呢?门锁变成了「开门锁」——谁都能开。
固件签名解决的核心问题有三个:
- 防止恶意固件注入——没有合法签名的固件,设备直接拒绝
- 检测固件篡改——哪怕改了一个比特,签名验证就会失败
- 建立信任链——从BootROM到应用固件,层层验证,环环相扣
你想想看,如果设备连自己跑的程序是不是原厂的都搞不清楚,那还谈什么安全?
注意:固件签名不是万能的。它只保证「谁签的」和「有没有被改」,不保证固件本身没有漏洞。签名过的恶意固件,依然是恶意固件。
签名与加密的区别
这个问题我经常被问到。很多人觉得签名就是加密的变种,其实完全两码事。
我用一张表来说明:
| 对比项 | 固件签名 | 固件加密 |
|---|---|---|
| 目的 | 验证身份和完整性 | 保护内容不被偷看 |
| 密钥使用 | 私钥签名,公钥验证 | 公钥加密,私钥解密 |
| 输出结果 | 固件原文 + 签名值 | 密文(原文不可见) |
| 能否恢复原文 | 能(签名不改变固件) | 能(解密后恢复) |
| 典型场景 | OTA升级、安全启动 | 固件传输、存储保护 |
举个例子你就明白了:
- 签名就像你在合同上签字——合同内容公开,但签字证明是你干的
- 加密就像把合同锁进保险柜——别人看不到内容,但打开保险柜的人不一定是你
实际项目中,我习惯把签名和加密一起用。先签名,再加密。这样既保证「是谁发的」,又保证「路上没人偷看」。
我的经验:千万别把签名密钥和加密密钥混用。我曾经见过一个项目,用同一对RSA密钥既做签名又做加密,结果被侧信道攻击一锅端。分开管理,各司其职。
固件签名的工作流程
下面这张图展示了固件签名的完整流程:
流程其实不复杂:
- 厂商对固件算哈希,得到一串「指纹」
- 用私钥加密这个指纹,生成签名值
- 固件和签名值一起发布
- 设备收到后,用公钥解密签名值,拿到原始指纹
- 设备自己算一遍固件的哈希,对比两个指纹
- 一致就通过,不一致就拒绝
关键点:整个过程中,固件本身是明文的。签名只是附加在固件后面的一小段数据。所以签名不影响固件的执行,只影响固件是否被信任。
常见的签名算法
我这些年用过的签名算法不少,挑几个常用的说说:
| 算法 | 密钥长度 | 签名长度 | 适用场景 |
|---|---|---|---|
| RSA-PSS | 2048/4096位 | 256/512字节 | 通用嵌入式设备 |
| ECDSA | 256/384位 | 64/96字节 | 资源受限的MCU |
| Ed25519 | 256位 | 64字节 | 高性能需求场景 |
我个人习惯:如果芯片资源够,优先用RSA 2048位。如果Flash和RAM紧张,用ECDSA P-256。Ed25519虽然快,但有些老芯片不支持。
避坑指南:我曾经在一个项目里用了RSA 1024位签名,觉得够用。结果两年后安全审计被要求升级到2048位,整个产线都得改。现在我的底线是:新项目起步就是RSA 2048或ECDSA P-256,别给自己挖坑。
小结
固件签名不是什么黑科技,它就是给固件贴了个「防伪标签」。没有它,你的设备就像没锁门的房子——谁都能进。
记住三点:
- 签名 ≠ 加密,各管各的事
- 签名解决的是「谁发的」和「改没改」
- 选算法时留点余量,别省那点资源
嗯,这一章就聊到这。下一章我们深入讲讲签名算法的具体实现和代码示例。