在嵌入式设备的内存中存储安全密钥

电器工程 手臂 皮质-m3 lpc
2022-01-30 03:23:13

我正在开发一种嵌入式设备,它发送/接收数据并将它们存储在密文模式(加密模式)中。现在存储密钥的最佳方法是什么(我使用的是 ARM CORTEX M 系列 MCU)?

1-将密钥存储在 SRAM 存储器中,在每个启动序列中,将密钥注入嵌入式 MCU 并将其存储在 SRAM 存储器中。我认为这是最好的方法,然后当 MCU 感应到渗透(使用篡改传感器或......)时,它可以快速擦除 SRAM 并自行重置。缺点:如果攻击者成功通过篡改和访问设备,SRAM 内存的安全性如何(防止代码挖掘)。我在 MCU 中找不到此内存的任何安全功能。

2-生成密钥并将它们存储在编程MCU的闪存中。MCU闪存支持CRP(代码读取保护),可防止代码挖掘,借助其内部的AES引擎和RNG(随机数生成)引擎,我们可以制作随机密钥并加密闪存并将该随机密钥存储在OTP中(一次可编程存储器 - 128 位加密存储器),然后在代码执行中,我们使用 RNG 密钥解码闪存并访问初始密钥和代码。缺点:密钥存储在非易失性存储器中,篡改将无用,攻击者有大量时间来挖掘密钥。

3-将密钥存储在EEPROM存储器中,结合上述2种方法,密钥存储在非易失性存储器中,但当篡改感应穿透EEPROM时可擦除。

我考虑 LPC18S57FBD208(带有 1MB 闪存、180MHZ、136KB SRAM、16KB EEPROM 和 TFT LCD 控制器的皮质 m3,我需要驱动 7" TFT LCD 和 AES 128 位加密引擎),还有其他更好的建议吗?

1个回答

这些选项都没有比其他选项更好或更差,因为它们都非常不安全。我选择选项 4。

  1. SRAM 是存储密钥最安全的地方,但绝对不能从外部注入它们。它们必须始终在引导期间在处理器内生成。做任何其他事情都会立即使其余部分无效 - 它自动不安全。

  2. 不要将密钥存储在非易失性存储器中,您是正确的。保护 EEPROM 或闪存不被读取并不重要。该代码读取保护保险丝很容易反转。攻击者只需要开盖(去除或化学蚀刻掉黑色环氧树脂封装以暴露内部的硅芯片)。在这一点上,它们可以覆盖裸片的一部分,即非易失性存储单元(这些部分非常规则,虽然单个存储单元非常小,但可以看到较大的结构)和一小块东西对 UV 不透明的部分会被遮盖住。然后攻击者只需在芯片上照射紫外线灯 5-10 分钟,然后重置所有保险丝,包括 CRP 保险丝。现在,任何标准程序员都可以读取 OTP 存储器。

或者,如果他们资金充足(例如,获得这些钥匙对某人来说价值超过 1000 美元),他们可以直接用几种类型的电子显微镜读取记忆单元。

为了安全起见,必须擦除而不是隐藏密钥。

  1. 不,出于与上述相同的原因。

现在,转到选项 4:

  1. 只需使用加密。密钥分配是一个已解决的问题。因此,请使用该现成的解决方案。芯片应使用其 RNG,并应考虑各种其他因素以确保它有足够的可用熵供应,并且引导加载程序应直接引导到生成所需密钥的程序中,这应该是通用的寄存器并直接移动到 SRAM 中,直到被擦除为止。

然而,存在一个问题,即除了 CPU 之外,没有任何东西知道密钥是什么。没问题:使用公钥加密。您存储在 OTP 内存中的是您的公钥。这把钥匙任何人都可以读,你可以把它贴在堆栈交换上,你可以把它涂在油轮的侧面,用 5 英尺高的字母,没关系。公钥加密的美妙之处在于它是非对称的。加密某些东西的密钥不能解密它,这需要私钥。反过来说,解密由公钥加密的东西的密钥不能用来加密东西。因此,CPU 生成密钥,使用您存储的公钥对密钥进行加密,然后通过 USB 或 RS232 或任何您想要的方式将其发送出去。读取密钥需要您的私钥,芯片根本不需要存储、发送或涉及这些信息。一旦你用你的私钥(在芯片外的其他地方)解密了密钥,你就设置好了。您有一个完全在芯片内生成的安全传输的密钥,除了公钥之外无需存储任何东西 - 如前所述,根本不需要保护它不被读取。

这个过程正式称为密钥协商,每个东西都使用它。你今天已经用了好几次了。有许多资源和库可用于处理它。请不要将密钥“注入”任何东西。

最后要提到的一件事:所有这些都没有实际意义,因为可以使用侧通道攻击轻松恢复 AES 密钥,该攻击位于电源上并测量电流消耗的微小变化以及由 CPU 中的位翻转引起的这些变化之间的时间作为寄存器。这一点,再加上对 AES(或任何可以使用的极少数可能的加密算法)如何工作的知识,使得恢复密钥相对容易且成本低廉。它不允许读取密钥,但它可以将密钥空间缩小到非常小,例如 255 个可能的密钥。该芯片也无法检测到它,因为它位于上游。

已经击败了“安全”加密处理器上的 AES-256 加密引导加载程序,甚至没有那么难。据我所知,这种攻击没有真正的硬件对策。然而,正是加密算法本身,以及它们如何需要 CPU 来翻转位,才导致了这个漏洞。我怀疑需要(并且希望正在)开发抗侧信道或防侧信道算法。

因此,就目前而言,如何在嵌入式设备上安全地存储密钥(甚至只是使用临时密钥)的真正答案是:你不能。

但至少如果您每次使用选项 4 中的密钥协商生成一个新密钥,那么侧信道攻击只能破坏正在使用的信道的密钥,并且只有在加密数据时他们有一段时间来监控电源. 如果您经常协商内部生成的新密钥,这可以提供有用的安全性。

生成密钥,并尽可能短地存储它们。