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


10

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

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

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

3-存储在EEPROM存储器中的密钥,上述两种方法的结合,密钥存储在非易失性存储器中,但当篡改时可穿透EEPROM。

我认为LPC18S57FBD208(具有1MB闪存,180MHZ,136KB SRAM,16KB EEPROM和TFT LCD控制器的皮质m3,我需要驱动7英寸TFT LCD和AES 128位加密引擎)对此是否还有其他更好的建议?

Answers:


18

这些选择都没有一个比其他选择更好或更糟糕的,因为它们都不安全。我要使用选项4。

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

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

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

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

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

现在,转到选项4:

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

但是,有一个问题,就是除了CPU之外什么都不知道秘密密钥是什么。没问题:使用公钥加密。您在OTP存储器中存储的是您的公钥。任何人都可以读取该密钥,也可以将其发布在堆栈交换上,也可以在油轮的侧面以5英尺高的字母进行涂漆,这没关系。关于公钥加密的妙处在于它是不对称的。加密某物的密钥无法解密,这需要私钥。相反,解密由公共密钥加密的内容的密钥不能用于加密某些内容。因此,CPU生成密钥,使用您存储的公共密钥对密钥进行加密,然后简单地通过USB或RS232或任何您想发送的密钥将其发送出去。阅读私钥需要您的私钥,不需要存储,发送或根本不涉及芯片。一旦用私钥(在芯片外部的其他地方)解密了私钥,就可以进行设置了。您拥有一个安全地传输的密钥,该密钥完全在芯片内生成,而无需存储除公共密钥以外的任何内容-如前所述,根本不需要保护它就不会被读取。

此过程正式称为密钥协商,并且所有事物都使用它。您今天已经使用过几次。有许多资源和库可用于处理它。请不要将钥匙“插入”任何东西。

最后要提的一件事是:所有这些都是没有意义的,因为可以使用侧通道攻击轻松恢复AES密钥,该通道位于电源上,可以测量电流消耗的微小变化以及由CPU翻转引起的这些变化之间的时序作为寄存器。再加上对AES(或可能使用的很小的一组可能的加密算法中的任何一种)如何工作的了解,就可以相对容易和廉价地恢复密钥。它不允许读取密钥,但是可以将密钥空间缩小到非常小的范围,例如255个可能的密钥。该芯片也无法检测到,因为它在上游。

击败了“安全”加密处理器上的AES-256加密引导加载程序,而且还不那么困难。据我所知,没有真正的硬件对抗措施来应对这种攻击。但是,导致此漏洞的原因是加密算法本身以及它们如何需要CPU翻转位。我怀疑需要开发(并且希望正在开发)抗旁通道算法或旁通道证明算法。

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

但是,至少如果您每次在选项4中使用密钥协商每次都生成一个新密钥,那么旁道攻击只会危害正在使用的通道的密钥,并且只有当他们有一段时间在加密数据时监控电源时。如果您经常协商内部生成的新密钥,则可以提供有用的安全性。

生成密钥,并将其存储在尽可能短的时间内。


真的感谢亲爱的Metacollin清除了我。但是我的项目由许多读者(包含mcu)和许多目标MCU组成,每个读者都必须能够读取任何目标,并且任何读者都必须能够读取任何目标。我认为他们必须同意用于传输数据的唯一密钥。根据您的回答,我认为例如LPC18S57安全皮质m3和STM32F429通用皮质m4甚至LPC1788通用皮质m3(更便宜的选择)之间没有太大差异,我不是在做绝密项目,但我想做这是我所能保证的。
Mahmoud Hosseinipour 2015年

2
您关于“可以轻松恢复AES密钥”的说法至少值得怀疑。我了解基于处理器的电流消耗来找出处​​理器中发生什么的技术的原理。但是,它假定加密和解密是CPU唯一要做的事情。但是,大多数应用程序只有1个CPU,可以同时处理多个任务。在一个块中,AES加密可能会发生数十个或数百个中断,这使得无法基于当前峰值来找到密钥。
bakcsa83

2
如果密钥不应该存储在闪存中,则生成密钥的代码也是如此...只需将操作码转换为汇编器,然后就可以拥有密钥,无论代码多么复杂。
伦丁

The wonderful thing about private key cryptography is that it is asymmetric. 即使从您的帖子中清楚地知道了这一点,我还是会在其他读者中提及它……上面引用中的s / private / public。
弧度

您可能可以使用方法4保护任何两个设备之间的通道,但是,如果没有某种形式的共享密钥,就不能保证与之通信的设备的真实性。如果您的用例需要身份验证,那么与仅在闪存中存储单个共享密钥的情况相比,使用密钥交换不会带来更好的收益。如果需要更好的安全性,则应使用加密芯片。
格雷格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.