3、密钥管理基础:密钥生命周期管理、对称密钥与非对称密钥、密钥存储策略
各位同学,咱们今天聊聊密钥管理。说实话,在AUTOSAR安全模块里,密钥管理是真正的基础设施。你想想看,算法再强,密钥一丢,全白搭。我在项目里见过太多因为密钥管理不当导致的安全事故了。
3.1 密钥生命周期管理
密钥不是永生的。它有自己的生命周期,从出生到死亡,每一步都得管好。
我个人习惯把密钥生命周期分成四个阶段:
- 生成阶段:密钥怎么来的?用硬件随机数发生器还是软件伪随机?我在一个项目里遇到过,客户用了一个弱随机数种子,结果生成的密钥能被预测。嗯,这很要命。
- 分发阶段:密钥怎么装到ECU里?是通过安全通道下发,还是预置在固件里?我建议尽量用安全通道,预置密钥风险太高。
- 使用阶段:密钥在运行时怎么被调用?每次使用都要校验完整性吗?这里有个坑——密钥使用次数限制。我曾经见过一个设计,同一个密钥被用了上亿次,最后被侧信道攻击破解了。
- 销毁阶段:密钥退役了怎么办?直接删掉?不行。你得确保密钥被彻底擦除,包括备份和缓存。我习惯的做法是:先覆写,再读回验证,最后物理销毁存储介质。
关键点:AUTOSAR规范里,密钥生命周期管理是通过Key Manager模块实现的。它负责跟踪每个密钥的状态,比如"生成中"、"激活"、"挂起"、"销毁"等。你写代码时,一定要实现状态机,别让密钥状态乱跳。
3.2 对称密钥与非对称密钥
说白了,对称密钥就是一把钥匙开一把锁,加密和解密用同一个密钥。非对称密钥呢,是一对钥匙——公钥加密,私钥解密。
在AUTOSAR里,这两种密钥各有各的用处:
| 特性 | 对称密钥 | 非对称密钥 |
|---|---|---|
| 速度 | 快,适合大量数据 | 慢,适合小数据 |
| 密钥管理 | 难,需要安全分发 | 相对容易,公钥可公开 |
| 典型算法 | AES-128/256 | RSA-2048, ECC |
| AUTOSAR用途 | 加密通信、MAC计算 | 数字签名、密钥交换 |
我在实际项目中,通常这样搭配使用:用非对称密钥做身份认证和密钥协商,然后协商出一个对称密钥,用来加密后续的通信数据。这样既保证了安全性,又兼顾了性能。
我的经验:别在ECU里存私钥。私钥应该放在HSM(硬件安全模块)里,或者用PUF(物理不可克隆函数)生成。我曾经见过一个项目,私钥直接写在Flash里,结果被读出来,整个安全体系就崩了。
3.3 密钥存储策略
密钥存哪儿?这是个大学问。你想想看,密钥如果存在普通Flash里,攻击者用个调试器就能读出来。那怎么存?
我总结了几种常见的存储策略:
- 硬件安全模块(HSM):最安全的方式。密钥存在HSM内部,CPU只能通过API调用,拿不到明文。我建议所有关键密钥都走这条路。
- 安全存储区:有些芯片有专门的OTP(一次性可编程)区域,或者安全Flash分区。密钥写进去后,就不能再改了。适合存根密钥。
- 派生存储:不直接存密钥,而是存一个种子值,运行时派生出实际密钥。这样即使种子被偷,攻击者也拿不到原始密钥。
- 加密存储:把密钥用另一个密钥加密后存起来。这有点像套娃,但确实有效。不过要注意,那个加密密钥本身也得安全存储。
避坑指南:我曾经在一个项目里,看到有人把密钥存在全局变量里。结果调试时,调试器一停,密钥就暴露了。千万别这么干!密钥应该存在堆上,用完立即清零。
最后,给你一个代码示例,展示如何在AUTOSAR里安全地使用密钥:
/* 安全密钥使用示例 */
void secure_communication(void) {
/* 从HSM获取密钥句柄,不是密钥本身 */
KeyHandle_t key = HSM_GetKeyHandle(KEY_ID_SESSION);
/* 使用密钥进行加密 */
uint8_t plaintext[] = "Hello AUTOSAR";
uint8_t ciphertext[16];
/* 调用HSM的加密接口,密钥不出HSM */
HSM_AES_Encrypt(key, plaintext, sizeof(plaintext), ciphertext);
/* 使用完毕,立即释放密钥句柄 */
HSM_ReleaseKeyHandle(key);
/* 清空临时缓冲区 */
memset(ciphertext, 0, sizeof(ciphertext));
}
嗯,这里要注意:HSM_GetKeyHandle返回的是句柄,不是密钥本身。这样即使代码被逆向,攻击者也拿不到密钥。我习惯在每次使用完密钥后,立即释放句柄并清空缓冲区,防止残留数据泄露。
好了,密钥管理的基础就这些。下一章咱们聊聊具体的密钥协商协议,比如怎么在CAN总线上安全地交换密钥。到时候我会分享一个我踩过的坑——密钥协商超时处理不当,导致ECU死锁。敬请期待。