3、密码学基础(下):对称加密(AES)、非对称加密(RSA)、密钥管理与硬件安全模块(HSM)
好,我们接着聊密码学。上一节我们讲了哈希和签名,这一节我们把剩下的几个硬骨头啃掉:AES、RSA,还有密钥管理。说实话,这部分内容在安全启动里是真正落地的技术。你光会理论不行,得知道芯片里怎么跑,密钥放哪,怎么防别人偷。
3.1 对称加密:AES 到底快在哪?
对称加密,说白了就是加密和解密用同一把钥匙。你想想看,这就像你家大门,用一把钥匙锁上,也用同一把钥匙打开。优点是快,非常快。缺点是密钥怎么安全地交给对方?这是个问题。
在嵌入式世界里,AES 是绝对的主角。我个人习惯用 AES-128 或 AES-256。为什么不用 DES?太老了,早被破解了。我在一个 IoT 项目里见过有人还在用 DES,结果产品上市没多久就被爆出安全漏洞,紧急召回。嗯,从那以后我再也不敢轻视算法强度了。
AES 有几种工作模式,我重点说两个:
- ECB 模式:简单粗暴,但千万别用。同样的明文块会生成同样的密文块,容易泄露模式信息。我曾经在分析一个固件镜像时,看到 ECB 加密的图片,轮廓都看得见,这加密跟没加密差不多。
- CBC 模式:每个明文块先跟上一个密文块异或,再加密。这样同样的明文块每次加密结果都不同。安全启动里常用这个模式。
重要:在安全启动场景中,AES 通常用于加密固件本身。BootROM 里硬编码了 AES 密钥,上电后解密下一级镜像。这个过程必须快,因为系统启动时间是有要求的。
代码示例,用 OpenSSL 做 AES-128-CBC 加解密:
// 加密
openssl enc -aes-128-cbc -K 00112233445566778899aabbccddeeff -iv 0102030405060708 -in firmware.bin -out firmware.enc
// 解密
openssl enc -d -aes-128-cbc -K 00112233445566778899aabbccddeeff -iv 0102030405060708 -in firmware.enc -out firmware_dec.bin
注意那个 -K 是密钥,-iv 是初始化向量。实际产品里,密钥不会这样明文写在命令行里,而是从 HSM 或 OTP 中读取。
3.2 非对称加密:RSA 的数学之美
非对称加密,就是一对钥匙:公钥和私钥。公钥可以公开,私钥自己藏好。你用公钥加密,只有私钥能解密。反过来,你用私钥签名,别人用公钥验证。
RSA 的安全性基于大整数分解。两个大素数相乘容易,但从乘积反推回两个素数,难。我当年学 RSA 时,老师让我们手算一个简单例子,p=3, q=11,n=33。那时候觉得好神奇,但实际产品里 n 是 2048 位甚至 4096 位,你想想看,那得多大。
在安全启动里,RSA 主要用来做签名验证,而不是加密数据。为什么?因为 RSA 太慢了。你拿 RSA 去加密整个固件,启动时间会让人崩溃。所以通常的做法是:
- 用 RSA 私钥对固件的哈希值签名
- BootROM 里存着 RSA 公钥
- 启动时,验证签名是否匹配
我曾经在一个项目里踩过坑:RSA 公钥长度选错了。当时为了省存储空间,用了 1024 位。结果几年后,业界发现 1024 位 RSA 已经不够安全了。没办法,只能重新流片,把公钥换成 2048 位。成本巨大。所以我的建议是:起步就用 2048 位,别省那点空间。
警告:RSA 的私钥一旦泄露,整个安全体系就崩塌了。私钥必须存储在 HSM 或安全芯片中,绝不能出现在开发人员的笔记本上。我曾经见过有人把私钥放在 Git 仓库里,那简直是灾难。
生成 RSA 密钥对的命令:
// 生成私钥
openssl genrsa -out private.pem 2048
// 提取公钥
openssl rsa -in private.pem -pubout -out public.pem
// 对固件签名
openssl dgst -sha256 -sign private.pem -out firmware.sig firmware.bin
// 验证签名
openssl dgst -sha256 -verify public.pem -signature firmware.sig firmware.bin
3.3 密钥管理:最容易被忽视的环节
说实话,算法本身是公开的,真正决定安全性的,是密钥管理。你算法再强,密钥被人偷了,一切白搭。
在嵌入式系统里,密钥管理有几个关键点:
- 密钥生成:必须在安全环境中生成,比如 HSM 内部。不能在普通 PC 上生成再导入,那样中间有泄露风险。
- 密钥存储:芯片内部有 OTP(一次性可编程存储器)或 eFuse,用来存储根密钥。这些区域只能写入一次,且无法被外部读取。
- 密钥使用:密钥只在芯片内部使用,不暴露到外部总线。比如 AES 加解密操作在硬件加速器里完成,软件只能告诉它「用密钥 ID 3 来解密」,但拿不到密钥本身。
- 密钥销毁:设备报废时,要能安全擦除密钥。有些芯片支持「安全清零」指令,一次性清除所有密钥。
提示:我个人习惯把密钥分成多个层级。比如根密钥(Root Key)存储在 OTP 中,它用来加密设备密钥(Device Key)。设备密钥再用来加密固件。这样即使设备密钥泄露,根密钥还在,可以重新派生。这叫「密钥分层」。
3.4 硬件安全模块(HSM):物理级别的保护
HSM 是什么?说白了就是一个专门干密码学活的硬件。它有自己的处理器、存储、甚至随机数发生器。外部只能通过 API 跟它交互,比如「请用密钥 ID 5 签名这段数据」,但你不能把密钥读出来。
在安全启动里,HSM 扮演的角色很关键:
- 它存储根密钥,防止物理攻击
- 它执行签名验证,加速运算
- 它提供真随机数,用于密钥生成
我记得有一次调试一个安全启动失败的问题,折腾了两天。最后发现是 HSM 的时钟配置不对,导致签名验证超时。嗯,硬件问题往往比软件问题更难排查。所以我的建议是:在开发阶段,先用软件模拟 HSM 的行为,等硬件就绪后再切换过去。
常见的 HSM 特性:
| 特性 | 说明 |
|---|---|
| 防篡改 | 检测到物理攻击时,自动擦除密钥 |
| 密钥隔离 | 不同应用使用不同密钥域,互不干扰 |
| 安全审计 | 记录所有密钥操作日志 |
| 真随机数 | 基于物理噪声源,不是伪随机 |
最后说一句,HSM 不是万能的。如果芯片设计本身有漏洞,比如侧信道攻击,HSM 也挡不住。但有了 HSM,攻击者的成本会高很多。对于大多数产品来说,这就够了。
好,这一节的内容就到这。下一节我们讲安全启动的完整流程,把 AES、RSA、HSM 串起来,看看它们是怎么协同工作的。