密码学基础回顾:对称加密与非对称加密、哈希函数、数字签名、PKI
做固件安全,绕不开密码学。说实话,我早年刚接触嵌入式安全时,觉得密码学是数学家的事,跟我一个写C的有什么关系?直到第一次被客户要求给产品加上签名验证,才发现不懂这些基础,连需求文档都读不明白。
这一章,咱们把密码学里跟固件签名最相关的几个概念捋一遍。不搞复杂的数学推导,重点说清楚它们各自干什么、怎么配合、以及你在实际项目中容易踩哪些坑。
对称加密 vs 非对称加密
先看加密。加密分两类:对称和非对称。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个密钥,加密解密用同一个 | 2个密钥,公钥加密、私钥解密 |
| 典型算法 | AES、DES、SM4 | RSA、ECDSA、SM2 |
| 速度 | 快(硬件加速常见) | 慢(尤其RSA) |
| 密钥分发 | 困难,需要安全通道 | 公钥可公开,私钥本地保管 |
| 固件场景 | 加密固件内容(较少单独用) | 签名验证(核心用途) |
对称加密速度快,适合大量数据。但问题来了——密钥怎么安全地传给对方?你想想看,如果我已经有一条安全通道传密钥,那我干嘛还要加密?这就是典型的「先有鸡还是先有蛋」问题。
非对称加密解决了这个困境。公钥随便发,私钥自己藏好。别人用你的公钥加密数据,只有你能用私钥解开。反过来,你用私钥签名,别人用公钥验证——这就是数字签名的核心逻辑。
哈希函数与SHA-256
哈希函数,说白了就是「数字指纹」。你给它任意长度的数据,它吐出一个固定长度的摘要。哪怕你只改了一个比特,摘要都会完全变样。
SHA-256是目前最常用的哈希算法之一,输出256位(32字节)的摘要。在固件签名中,我们不会直接对几百KB的固件做签名运算——太慢了。而是先对固件算SHA-256,得到一个32字节的哈希值,然后只对这个哈希值签名。
关键特性:
- 单向性:从哈希值反推原始数据,计算上不可行
- 抗碰撞:找到两个不同数据产生相同哈希值,极其困难
- 雪崩效应:输入微小变化,输出完全改变
我曾经在项目里遇到过一个问题:有人把固件里的一个字节从0x00改成了0x01,然后重新算了CRC校验,结果CRC竟然没变!但换成SHA-256,哪怕改一个比特,摘要就完全不同了。从那以后,我所有涉及完整性的地方,一律用SHA-256,不用CRC。
数字签名原理:RSA与ECDSA
数字签名,是哈希函数和非对称加密的组合拳。流程很简单:
- 签名方(厂商):对固件算SHA-256 → 用私钥加密哈希值 → 得到签名
- 验证方(设备):对收到的固件算SHA-256 → 用公钥解密签名 → 对比两个哈希值
如果一致,说明固件没被篡改,而且确实来自持有私钥的厂商。
RSA和ECDSA是两种主流的签名算法。我直接说结论:
| 对比项 | RSA | ECDSA |
|---|---|---|
| 密钥长度 | 2048/4096位 | 256/384位(同等安全强度) |
| 签名速度 | 慢(尤其私钥操作) | 快 |
| 验证速度 | 快 | 较快 |
| 签名大小 | 与密钥长度相同(如256字节) | 固定64字节(P-256曲线) |
| 嵌入式适用性 | 资源充足时可用 | 更适合资源受限设备 |
我个人更倾向ECDSA,尤其是P-256曲线。签名短、速度快,在MCU上跑起来压力小很多。但要注意,ECDSA对随机数质量要求极高——如果随机数生成器有问题,私钥可能被恢复出来。这个坑我踩过,后面章节会细讲。
公钥基础设施(PKI)概念
有了签名算法,还有一个问题没解决:设备怎么信任你手里的公钥?
你想想看,如果攻击者把自己的公钥写进设备,然后用对应的私钥签名恶意固件,设备照样会认为固件是合法的。所以,公钥本身也需要被保护、被认证。
PKI就是解决这个问题的体系。核心概念就几个:
- 根证书:自签名的顶级信任锚,由CA(证书颁发机构)持有
- 中间证书:由根证书签发,用于分层管理
- 终端实体证书:最终用于签名固件的证书
- 证书链:从根证书到终端证书的信任传递路径
在固件场景中,我们通常把根证书的公钥烧死在芯片的OTP(一次性可编程)区域。然后固件签名时附带完整的证书链,设备验证时从根证书开始逐级验证,直到确认签名证书可信。
知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作后续章节的「地图」:
从这张图可以看得很清楚:加密算法是地基,哈希和签名是支柱,PKI是信任骨架,最终支撑起固件签名验证这个上层建筑。后面每一章,都会围绕这张图里的某个环节展开。