STM32 上 AES 密钥派生和存储的良好实践

Gui*_*ean 2 cryptography aes stm32

我正在 STM32L4x6 上开发一个设备。它通过 BLE 连接到智能手机并与其交换加密数据。

加密是 AES-GCM,我使用的是 STMicro 提供的参考实现。

我在 Curve25519 上使用 Diffie-Hellman 协议实现了共享秘密交换机制。现在我直接使用这个共享密钥作为 AES 密钥。

然而我对两点感到困惑:

  • 我想我必须从共享密钥中派生出会话密钥,但我不太明白如何实现。
  • 关于STM32上的密钥存储,常见/最佳实践是什么?将密钥存储在闪存中并将闪存设置为读保护级别 1 是否足够?

谢谢

Jac*_*mok 5

至于派生会话密钥 - 您可能需要研究密钥派生函数 (KDF)主题。谷歌搜索它会返回许多与建立会话密钥相关的有用信息。您也可以在https://crypto.stackexchange.com/上提问。

至于在 STM32 中存储密钥 - 这取决于您的要求。密钥是否需要在会话之间保留,还是可以在每次建立连接时生成一个新密钥?每次建立新连接时生成新密钥会更安全,原因有两个:

  1. 每个连接都是不同的,因此即使有人设法从过去获取会话密钥,它也只能用于解密该会话。

  2. 如果您为每个新会话生成一个新密钥,则无需将其存储在闪存等任何地方,因为您可以仅将其保存在 RAM 中。关闭设备电源将擦除密钥。启用读保护可防止访问 RAM 以及内部闪存。

然而,关于第二点 - STM32 不被视为“安全微控制器”。它缺乏防止硬件攻击的硬件元素 - 电源电压故障检测、旁道预防、安全网格等。只要有足够的资源和决心,攻击者将能够获取您使用的加密密钥,例如通过磨碎芯片封装并光学读取您的数据。这涉及到设备的安全性如何——开发时间成本、硬件安全成本。使用STM32,您所能做的就是让它变得更难(将密钥保留在RAM中,仅在需要时才使用,然后用噪音覆盖它们)并限制攻击者的范围(尽可能频繁地更改会话密钥,例如每个会话) 。