4. 密码学应用:对称与非对称加密、哈希函数与HMAC、数字签名与证书、密钥管理最佳实践
密码学,说白了就是安全机制的数学根基。你想想看,没有密码学,我们所有的加密、认证、完整性校验都无从谈起。这一章我会把密码学里最核心的几个模块串起来讲,结合我这些年做硬件安全踩过的坑,希望能帮你建立起一个实用的知识框架。
4.1 对称加密:快,但密钥怎么分?
对称加密,加密和解密用同一个密钥。优点是快,硬件实现起来也简单。我最早做嵌入式安全时,用的就是 AES-128,跑在 50MHz 的 MCU 上,吞吐量完全够用。
常见的对称加密算法:
| 算法 | 密钥长度 | 分组大小 | 模式 | 典型场景 |
|---|---|---|---|---|
| AES | 128/192/256 bit | 128 bit | ECB/CBC/GCM/CTR | 数据加密、存储加密 |
| ChaCha20 | 256 bit | 流加密 | Poly1305 | 移动端、IoT 设备 |
| SM4 | 128 bit | 128 bit | ECB/CBC/GCM | 国密合规场景 |
这里有个坑——ECB 模式。我曾经在审计一个固件加密方案时,发现对方用了 ECB 模式加密配置数据。结果呢?相同的明文块会产生相同的密文块,攻击者通过模式识别就能猜出数据内容。嗯,这个坑我建议你直接避开,优先用 GCM 或 CTR 模式。
4.2 非对称加密:慢,但密钥管理方便
非对称加密用一对密钥:公钥公开,私钥保密。优点是解决了密钥分发问题,缺点是慢。RSA 2048 位签名,比 AES-128 慢好几个数量级。
常见的非对称算法:
- RSA:基于大整数分解,2048 位以上才安全。我建议新项目直接上 3072 位。
- ECC(椭圆曲线):同等安全强度下,密钥更短。256 位 ECC 约等于 3072 位 RSA。硬件实现时面积更小,适合 IoT。
- SM2:国密标准,基于 ECC。国内项目必须用。
- Ed25519:我个人比较喜欢这个,实现简单,抗侧信道攻击能力强。
非对称加密在硬件安全里最常见的用法是密钥协商和数字签名。比如安全芯片和主机之间建立安全信道,通常先用 ECDH 协商出会话密钥,再用这个会话密钥做对称加密通信。
4.3 哈希函数与 HMAC:完整性校验的基石
哈希函数把任意长度的数据映射成固定长度的摘要。好的哈希函数要满足:抗原像性(不能从摘要反推原文)、抗第二原像性(不能找到另一个原文产生相同摘要)、抗碰撞性(不能找到两个不同原文产生相同摘要)。
常用的哈希算法:
| 算法 | 摘要长度 | 安全状态 | 硬件实现 |
|---|---|---|---|
| SHA-256 | 256 bit | 安全 | 广泛支持 |
| SHA-3 | 224/256/384/512 bit | 安全 | 较新,硬件较少 |
| SM3 | 256 bit | 安全 | 国密硬件支持 |
| MD5 / SHA-1 | 128 / 160 bit | 已破解,禁止使用 | — |
HMAC(基于哈希的消息认证码)解决了哈希函数的一个问题:单纯哈希无法防篡改,因为攻击者可以同时修改数据和哈希值。HMAC 引入了一个密钥,只有知道密钥的人才能计算出正确的 MAC。
HMAC 的公式很简单:
HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
其中 K' 是密钥经过填充后的结果,opad 和 ipad 是固定的填充字节。这个结构能抵抗长度扩展攻击。
4.4 数字签名与证书:你是谁?谁信你?
数字签名解决了两个问题:身份认证和不可否认性。签名过程:私钥签名,公钥验签。只要私钥不泄露,签名就是可信的。
数字证书(X.509)把公钥和身份信息绑定在一起,由证书颁发机构(CA)签名。证书链的信任模型是这样的:
根 CA(自签名)→ 中间 CA → 终端证书(设备证书)
在硬件安全里,证书链验证是设备身份认证的核心。比如安全启动时,BootROM 里预置了根 CA 公钥,用它来验证下一级固件的签名,逐级信任传递。
我参与过一个车规级项目,要求每个 ECU 都有唯一的设备证书。生产时在安全环境下生成密钥对,私钥写入安全芯片,公钥提交给 CA 签发证书。这个流程看起来简单,但实际落地时有很多细节:
- 密钥生成必须在硬件安全模块(HSM)内完成,不能导出私钥
- 证书签发请求(CSR)必须包含设备唯一标识
- 证书吊销列表(CRL)必须定期更新
4.5 密钥管理最佳实践:安全的核心
密钥管理是密码学应用里最容易被忽视、但也是最重要的环节。算法再强,密钥泄露了等于白搭。
我总结了几条密钥管理的最佳实践:
- 密钥分级:主密钥加密子密钥,子密钥加密数据。这样即使子密钥泄露,主密钥还是安全的。
- 硬件隔离:密钥存储在安全元件或 TPM 中,CPU 无法直接读取密钥值,只能通过 API 调用加解密操作。
- 密钥生命周期管理:生成、分发、使用、更新、吊销、销毁,每个阶段都要有记录和审计。
- 防侧信道攻击:硬件实现时要注意时序、功耗、电磁辐射等侧信道泄露。比如 RSA 的私钥运算时间如果和密钥位相关,攻击者就能通过时序分析恢复私钥。
- 密钥更新机制:设备在生命周期内要支持密钥更新,不能把密钥写死。
下面这张图展示了密钥分级的典型架构:
4.6 故障注入对密码学实现的威胁
这一节和我们的课程主题直接相关。故障注入攻击(如电压毛刺、时钟毛刺、激光注入)可以破坏密码学算法的执行过程,从而泄露密钥或绕过认证。
常见的攻击场景:
- 跳过签名验证:在 BootROM 验签时注入故障,让 CPU 跳过验签分支,直接执行恶意固件。
- 泄露密钥:在 AES 最后一轮注入故障,通过分析错误密文恢复密钥。这就是著名的 DFA(差分故障分析)。
- 绕过 PIN 校验:在比较 PIN 的指令上注入故障,让比较结果永远为真。
我记得有一次做安全评估,目标设备用 RSA 签名验证固件。我们在验签函数返回前注入一个时钟毛刺,让 CPU 跳过条件跳转指令,结果验签直接通过。嗯,从那以后我设计安全启动时,都会在关键路径上加冗余校验和随机延迟。
4.7 本章小结
密码学应用不是选几个算法拼在一起就完事了。对称加密解决速度问题,非对称加密解决密钥分发问题,哈希和 HMAC 解决完整性校验问题,数字签名和证书解决身份认证问题。而密钥管理,是把这一切串起来的红线。
在硬件安全领域,密码学实现的鲁棒性比算法强度更重要。一个实现有漏洞的 AES-256,不如一个实现正确的 AES-128。故障注入攻击专门针对实现环节,所以我们在设计时必须把防护措施考虑进去。