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 模式。

避坑指南:对称加密的密钥分发是最大的痛点。如果你在硬件设备里预置了密钥,那这个密钥一旦被提取出来,整个产品线的安全就全完了。我曾经见过一个智能门锁项目,所有设备共用同一个 AES 密钥,结果一台设备被破解,全系列都能被远程开锁。

4.2 非对称加密:慢,但密钥管理方便

非对称加密用一对密钥:公钥公开,私钥保密。优点是解决了密钥分发问题,缺点是慢。RSA 2048 位签名,比 AES-128 慢好几个数量级。

常见的非对称算法:

  • RSA:基于大整数分解,2048 位以上才安全。我建议新项目直接上 3072 位。
  • ECC(椭圆曲线):同等安全强度下,密钥更短。256 位 ECC 约等于 3072 位 RSA。硬件实现时面积更小,适合 IoT。
  • SM2:国密标准,基于 ECC。国内项目必须用。
  • Ed25519:我个人比较喜欢这个,实现简单,抗侧信道攻击能力强。

非对称加密在硬件安全里最常见的用法是密钥协商和数字签名。比如安全芯片和主机之间建立安全信道,通常先用 ECDH 协商出会话密钥,再用这个会话密钥做对称加密通信。

经验之谈:非对称加密的私钥必须硬件保护。我见过太多把私钥放在文件系统里的案例,攻击者拿到固件就能提取私钥。正确的做法是用安全元件(SE)或 TPM 来存储和运算私钥,私钥永远不出硬件。

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 是固定的填充字节。这个结构能抵抗长度扩展攻击。

避坑指南:我曾经审计过一个 OTA 升级方案,他们用 SHA-256 校验固件完整性,但没加 HMAC。结果攻击者可以替换固件,同时重新计算哈希值,校验照样通过。正确的做法是用 HMAC 或数字签名来保护固件。

4.4 数字签名与证书:你是谁?谁信你?

数字签名解决了两个问题:身份认证和不可否认性。签名过程:私钥签名,公钥验签。只要私钥不泄露,签名就是可信的。

数字证书(X.509)把公钥和身份信息绑定在一起,由证书颁发机构(CA)签名。证书链的信任模型是这样的:

根 CA(自签名)→ 中间 CA → 终端证书(设备证书)

在硬件安全里,证书链验证是设备身份认证的核心。比如安全启动时,BootROM 里预置了根 CA 公钥,用它来验证下一级固件的签名,逐级信任传递。

我参与过一个车规级项目,要求每个 ECU 都有唯一的设备证书。生产时在安全环境下生成密钥对,私钥写入安全芯片,公钥提交给 CA 签发证书。这个流程看起来简单,但实际落地时有很多细节:

  • 密钥生成必须在硬件安全模块(HSM)内完成,不能导出私钥
  • 证书签发请求(CSR)必须包含设备唯一标识
  • 证书吊销列表(CRL)必须定期更新
经验之谈:证书验证时一定要检查证书有效期和吊销状态。我见过一个项目,证书过期两年了设备还在用,攻击者拿这个过期证书照样能通过认证。嗯,这个低级错误其实很常见。

4.5 密钥管理最佳实践:安全的核心

密钥管理是密码学应用里最容易被忽视、但也是最重要的环节。算法再强,密钥泄露了等于白搭。

我总结了几条密钥管理的最佳实践:

  1. 密钥分级:主密钥加密子密钥,子密钥加密数据。这样即使子密钥泄露,主密钥还是安全的。
  2. 硬件隔离:密钥存储在安全元件或 TPM 中,CPU 无法直接读取密钥值,只能通过 API 调用加解密操作。
  3. 密钥生命周期管理:生成、分发、使用、更新、吊销、销毁,每个阶段都要有记录和审计。
  4. 防侧信道攻击:硬件实现时要注意时序、功耗、电磁辐射等侧信道泄露。比如 RSA 的私钥运算时间如果和密钥位相关,攻击者就能通过时序分析恢复私钥。
  5. 密钥更新机制:设备在生命周期内要支持密钥更新,不能把密钥写死。

下面这张图展示了密钥分级的典型架构:

密钥分级架构图 密钥分级架构 主密钥(MK) 存储在 HSM/SE 中,永不导出 密钥加密密钥(KEK) 由 MK 加密存储,用于加密工作密钥 工作密钥(WK) 由 KEK 加密存储,用于实际加解密数据 加密数据 由 WK 加密,存储在 Flash/外部存储 密钥分级原则:主密钥保护 KEK,KEK 保护工作密钥,工作密钥保护数据
核心原则:密钥分级 + 硬件隔离 + 生命周期管理 = 密钥安全。这三条缺一不可。

4.6 故障注入对密码学实现的威胁

这一节和我们的课程主题直接相关。故障注入攻击(如电压毛刺、时钟毛刺、激光注入)可以破坏密码学算法的执行过程,从而泄露密钥或绕过认证。

常见的攻击场景:

  • 跳过签名验证:在 BootROM 验签时注入故障,让 CPU 跳过验签分支,直接执行恶意固件。
  • 泄露密钥:在 AES 最后一轮注入故障,通过分析错误密文恢复密钥。这就是著名的 DFA(差分故障分析)。
  • 绕过 PIN 校验:在比较 PIN 的指令上注入故障,让比较结果永远为真。

我记得有一次做安全评估,目标设备用 RSA 签名验证固件。我们在验签函数返回前注入一个时钟毛刺,让 CPU 跳过条件跳转指令,结果验签直接通过。嗯,从那以后我设计安全启动时,都会在关键路径上加冗余校验和随机延迟。

避坑指南:密码学实现必须考虑故障注入防护。常见的防护措施包括:双重校验(关键操作执行两次,结果一致才通过)、随机延迟(打乱攻击者的时序窗口)、错误掩码(检测到故障时返回随机数据,而不是直接报错)。

4.7 本章小结

密码学应用不是选几个算法拼在一起就完事了。对称加密解决速度问题,非对称加密解决密钥分发问题,哈希和 HMAC 解决完整性校验问题,数字签名和证书解决身份认证问题。而密钥管理,是把这一切串起来的红线。

在硬件安全领域,密码学实现的鲁棒性比算法强度更重要。一个实现有漏洞的 AES-256,不如一个实现正确的 AES-128。故障注入攻击专门针对实现环节,所以我们在设计时必须把防护措施考虑进去。

最后说一句:密码学是安全的基础,但不是全部。再强的密码学也防不住一个把密钥贴在设备外壳上的工程师。安全是一个系统工程,人、流程、技术,三者都要到位。