STM32 上 AES 密钥推导和存储的良好实践
Good practices for AES key derivation and storage on STM32
我正在 STM32L4x6 上开发一个设备。它通过 BLE 连接到智能手机,并与其交换加密数据。
加密是 AES-GCM,我使用的是 STMicro 提供的参考实现。
我已经在 Curve25519 上使用 Diffie-Helman 协议实现了共享秘密交换机制。现在我直接使用这个共享密钥作为 AES 密钥。
但是我对两点感到困惑:
- 我想我必须从共享密钥中导出会话密钥,但我真的不明白如何。
- 关于 STM32 上的密钥存储,common/best 做法是什么?将密钥存储在闪存中并将闪存设置为读取保护级别 1 是否足够?
谢谢
关于导出会话密钥 - 您可能需要查看 Key Derivation Function (KDF). Googling it returns a lot of useful informations related to establishing session keys. You may also ask your question on https://crypto.stackexchange.com/ 的主题。
至于在 STM32 中存储密钥 - 这取决于您的要求。密钥是否需要在会话之间保持不变,或者您可以在每次建立连接时生成一个新密钥吗?每次建立新连接时生成新密钥会更安全,原因有二:
每个连接都是不同的,所以即使有人设法从过去的会话中获取密钥,它也只能用于解密该会话。
如果您为每个新会话生成一个新密钥,则无需将其存储在闪存等任何地方,因为您可以只将其保存在 RAM 中。关闭设备将擦除密钥。启用读取保护可防止访问 RAM 以及内部闪存。
关于第二点 - STM32 不被视为 "Secure Microcontroller"。它缺乏防止硬件攻击的硬件元素——电源电压故障检测、侧信道预防、安全网格等。只要有足够的资源和决心,攻击者将能够获得您使用的加密密钥,例如通过粉碎芯片封装并以光学方式读取您的数据。这涉及到设备真正必须有多安全的方面——开发时间成本、硬件安全成本。使用 STM32,您所能做的就是让它变得更难(将密钥保存在 RAM 中,仅在需要时使用,然后用噪声覆盖它们)并限制攻击者的范围(尽可能频繁地更改会话密钥,例如每次会话) .
我正在 STM32L4x6 上开发一个设备。它通过 BLE 连接到智能手机,并与其交换加密数据。
加密是 AES-GCM,我使用的是 STMicro 提供的参考实现。
我已经在 Curve25519 上使用 Diffie-Helman 协议实现了共享秘密交换机制。现在我直接使用这个共享密钥作为 AES 密钥。
但是我对两点感到困惑: - 我想我必须从共享密钥中导出会话密钥,但我真的不明白如何。 - 关于 STM32 上的密钥存储,common/best 做法是什么?将密钥存储在闪存中并将闪存设置为读取保护级别 1 是否足够?
谢谢
关于导出会话密钥 - 您可能需要查看 Key Derivation Function (KDF). Googling it returns a lot of useful informations related to establishing session keys. You may also ask your question on https://crypto.stackexchange.com/ 的主题。
至于在 STM32 中存储密钥 - 这取决于您的要求。密钥是否需要在会话之间保持不变,或者您可以在每次建立连接时生成一个新密钥吗?每次建立新连接时生成新密钥会更安全,原因有二:
每个连接都是不同的,所以即使有人设法从过去的会话中获取密钥,它也只能用于解密该会话。
如果您为每个新会话生成一个新密钥,则无需将其存储在闪存等任何地方,因为您可以只将其保存在 RAM 中。关闭设备将擦除密钥。启用读取保护可防止访问 RAM 以及内部闪存。
关于第二点 - STM32 不被视为 "Secure Microcontroller"。它缺乏防止硬件攻击的硬件元素——电源电压故障检测、侧信道预防、安全网格等。只要有足够的资源和决心,攻击者将能够获得您使用的加密密钥,例如通过粉碎芯片封装并以光学方式读取您的数据。这涉及到设备真正必须有多安全的方面——开发时间成本、硬件安全成本。使用 STM32,您所能做的就是让它变得更难(将密钥保存在 RAM 中,仅在需要时使用,然后用噪声覆盖它们)并限制攻击者的范围(尽可能频繁地更改会话密钥,例如每次会话) .