代码之家  ›  专栏  ›  技术社区  ›  Guillaume Petitjean

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

  •  0
  • Guillaume Petitjean  · 技术社区  · 6 年前

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

    加密是aes-gcm,我正在使用stmicro提供的引用实现。

    我在curve25519上使用diffie-helman协议实现了一个共享的秘密交换机制。现在我将这个共享的秘密直接用作AES密钥。

    然而,我对以下两点感到困惑: -我想我必须从共享密钥中派生一个会话密钥,但是我真的不知道怎么做。 -关于STM32上的密钥存储,常见/最佳做法是什么?是否足以将密钥存储在闪存中并将闪存设置为读保护级别1?

    谢谢你

    1 回复  |  直到 6 年前
        1
  •  3
  •   J_S    6 年前

    至于派生会话密钥,您可能需要研究 Key Derivation Function (KDF) . 通过谷歌搜索,它可以返回许多与建立会话密钥相关的有用信息。你也可以问你的问题 https://crypto.stackexchange.com/ .

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

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

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

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