3、密钥管理基础:对称密钥与非对称密钥、密钥生命周期管理、密钥存储安全策略、HSE密钥槽的概念

各位同学,欢迎来到第三章。这一章我们聊聊密钥管理。说实话,密钥管理是整个安全体系的基石。你算法选得再好,密钥一旦泄露,一切归零。我在项目里见过太多这样的案例了——安全芯片跑得飞起,结果密钥被人从Flash里直接读出来了,你说尴尬不尴尬?

3.1 对称密钥与非对称密钥

先说说这两种密钥的区别。说白了,对称密钥就是加密和解密用同一个钥匙。你想想看,就像你家大门钥匙,锁门和开门用的是同一把。非对称密钥呢,是一对钥匙——公钥和私钥。公钥可以公开,私钥自己藏好。

对称密钥的特点:

  • 速度快,适合大量数据加密
  • 密钥分发是个大问题
  • 常用算法:AES、DES、SM4

非对称密钥的特点:

  • 速度慢,适合小数据量或密钥交换
  • 解决了密钥分发问题
  • 常用算法:RSA、ECC、SM2

实际项目中的选择:

我在做车载T-Box项目时,用的是混合方案——用非对称密钥做身份认证和会话密钥协商,然后用对称密钥加密实际通信数据。这样既保证了安全性,又兼顾了性能。

特性 对称密钥 非对称密钥
密钥数量 1个 2个(公钥+私钥)
计算速度 慢(约慢100-1000倍)
密钥长度 128/256位 2048位以上(RSA)
典型用途 数据加密 数字签名、密钥交换

3.2 密钥生命周期管理

密钥不是永生的。它有自己的生命周期,从出生到死亡。我习惯把密钥生命周期分成四个阶段:

  1. 生成阶段——密钥的诞生
  2. 分发阶段——密钥的运输
  3. 使用阶段——密钥的工作
  4. 销毁阶段——密钥的退役

生成阶段要注意什么?

密钥生成必须依赖真随机数发生器(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的核心资源,合理分配很重要