3、密钥管理基础:对称密钥与非对称密钥、密钥生命周期管理、密钥存储安全策略、HSE密钥槽的概念
各位同学,欢迎来到第三章。这一章我们聊聊密钥管理。说实话,密钥管理是整个安全体系的基石。你算法选得再好,密钥一旦泄露,一切归零。我在项目里见过太多这样的案例了——安全芯片跑得飞起,结果密钥被人从Flash里直接读出来了,你说尴尬不尴尬?
3.1 对称密钥与非对称密钥
先说说这两种密钥的区别。说白了,对称密钥就是加密和解密用同一个钥匙。你想想看,就像你家大门钥匙,锁门和开门用的是同一把。非对称密钥呢,是一对钥匙——公钥和私钥。公钥可以公开,私钥自己藏好。
对称密钥的特点:
- 速度快,适合大量数据加密
- 密钥分发是个大问题
- 常用算法:AES、DES、SM4
非对称密钥的特点:
- 速度慢,适合小数据量或密钥交换
- 解决了密钥分发问题
- 常用算法:RSA、ECC、SM2
实际项目中的选择:
我在做车载T-Box项目时,用的是混合方案——用非对称密钥做身份认证和会话密钥协商,然后用对称密钥加密实际通信数据。这样既保证了安全性,又兼顾了性能。
| 特性 | 对称密钥 | 非对称密钥 |
|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) |
| 计算速度 | 快 | 慢(约慢100-1000倍) |
| 密钥长度 | 128/256位 | 2048位以上(RSA) |
| 典型用途 | 数据加密 | 数字签名、密钥交换 |
3.2 密钥生命周期管理
密钥不是永生的。它有自己的生命周期,从出生到死亡。我习惯把密钥生命周期分成四个阶段:
- 生成阶段——密钥的诞生
- 分发阶段——密钥的运输
- 使用阶段——密钥的工作
- 销毁阶段——密钥的退役
生成阶段要注意什么?
密钥生成必须依赖真随机数发生器(TRNG)。千万别用伪随机数,我在一个IoT项目中见过有人用rand()函数生成密钥,结果被攻击者猜出来了。嗯,那项目后来重做了。
我的建议:
STM32HSE内部集成了硬件TRNG,生成密钥时直接用HSE的API就好。别自己写随机数生成逻辑,容易出问题。
分发阶段怎么搞?
对称密钥的分发是最头疼的。我一般用两种方式:
- 预置:生产时直接烧录到设备中
- 协商:通过非对称密钥建立安全通道后传输
使用阶段的注意事项:
密钥在使用过程中要定期更换。具体周期看安全等级要求,一般建议:
- 会话密钥:每次会话更换
- 存储密钥:每1-3年更换
- 根密钥:尽量不换,但要有备份机制
警告:
密钥销毁不是简单地删除变量。我曾经见过有人用memset把密钥清0,结果编译器优化掉了,密钥还在内存里。正确的做法是用专门的擦除函数,或者写入随机数覆盖。
3.3 密钥存储安全策略
密钥存哪儿?这是个好问题。我见过太多把密钥硬编码在代码里的案例了。你想想看,固件都能被读出来,密钥还能安全吗?
常见的存储方式对比:
| 存储位置 | 安全性 | 适用场景 |
|---|---|---|
| Flash明文 | 低 | 不推荐 |
| Flash加密存储 | 中 | 低安全需求 |
| HSE密钥槽 | 高 | 高安全需求 |
| 外部安全芯片 | 极高 | 金融级安全 |
我的经验:
对于STM32HSE来说,最安全的做法就是把密钥存在HSE的密钥槽里。密钥一旦写入,CPU就再也读不出来了。只能通过HSE的API来使用密钥进行加解密操作。说白了,密钥对CPU来说是黑盒。
3.4 HSE密钥槽的概念
终于说到重点了。HSE密钥槽是什么?你可以把它想象成一个保险柜阵列。每个保险柜(密钥槽)可以存放一个密钥,而且这个保险柜只有HSE自己能打开。
密钥槽的特点:
- 每个槽有唯一编号(0, 1, 2, ...)
- 密钥写入后不可读出
- 支持多种密钥类型(AES、RSA、ECC等)
- 可以设置使用权限
实际使用示例:
// 将AES密钥写入槽0
HSE_Status_t status;
HSE_AES_KeyConfig_t keyConfig;
keyConfig.keySlot = 0; // 使用槽0
keyConfig.keySize = HSE_AES_KEY_SIZE_256;
keyConfig.keyData = (uint8_t*)"my_secret_key_256bit_data_here";
status = HSE_AES_WriteKey(&keyConfig);
if (status == HSE_SUCCESS) {
// 密钥写入成功,现在可以用槽0进行加解密了
}
密钥槽的管理策略:
我一般这样分配密钥槽:
- 槽0-3:存储根密钥(用于加密其他密钥)
- 槽4-7:存储设备身份密钥
- 槽8-15:存储会话密钥(动态分配)
避坑指南:
我曾经犯过一个错误——把密钥槽0用于会话密钥,结果每次会话都要重新写入。后来发现槽0的擦写次数有限,差点把HSE写废了。记住:根密钥用低编号槽,会话密钥用高编号槽。
密钥槽的安全特性:
- 物理防护:HSE有金属屏蔽层,防止侧信道攻击
- 逻辑防护:只有经过授权的代码才能访问密钥槽
- 生命周期防护:密钥槽可以锁定,锁定后不可更改
嗯,这一章的内容就到这里。密钥管理是个大话题,但核心就三点:选对算法、管好生命周期、存对地方。下一章我们聊聊HSE的启动流程,看看密钥是怎么在系统启动时被安全加载的。
本章小结:
- 对称密钥快但分发难,非对称密钥慢但安全
- 密钥生命周期要管好生成、分发、使用、销毁四个阶段
- 密钥存储首选HSE密钥槽,别放Flash明文
- 密钥槽是HSE的核心资源,合理分配很重要