这些选择都没有一个比其他选择更好或更糟糕的,因为它们都不安全。我要使用选项4。
SRAM是存储密钥的最安全的地方,但是绝对不能从外界注入它们。它们必须始终在引导过程中在处理器内生成。进行其他任何操作都会立即使其余部分无效-这是自动不安全的。
不要将密钥存储在非易失性存储器中,这是正确的。是否保护EEPROM或闪存不被读取并不重要。该读码保护保险丝很容易反转。攻击者只需要开盖(移除或化学蚀刻掉黑色环氧树脂包装,以露出内部的硅片)。在这一点上,它们可以掩盖裸片的一部分,即非易失性存储单元(这些部分非常规则,虽然单个存储单元从小到大,但可以看到较大的结构)和一小部分对紫外线不透明的区域被遮盖了。然后,攻击者只需将紫外线照射在芯片上5-10分钟,即可重置所有保险丝,包括CRP保险丝。现在,任何标准编程器都可以读取OTP存储器。
或者,如果他们有足够的资金(例如,获得这些钥匙对某人来说价值超过1000美元),他们只需使用几种类型的电子显微镜直接读取存储单元即可。
为了安全起见,必须擦除而不是隐藏密钥。
- 不,出于上述相同原因。
现在,转到选项4:
- 只需使用加密即可。密钥分发是一个已解决的问题。因此,请使用该随时可用的解决方案。芯片应使用其RNG,并应考虑各种其他因素以确保其具有足够的熵供应,并且引导加载程序应直接引导至生成所需秘密密钥的程序中,这通常是通用的寄存器并直接移动到SRAM中,它们将一直保留直到被擦除。
但是,有一个问题,就是除了CPU之外什么都不知道秘密密钥是什么。没问题:使用公钥加密。您在OTP存储器中存储的是您的公钥。任何人都可以读取该密钥,也可以将其发布在堆栈交换上,也可以在油轮的侧面以5英尺高的字母进行涂漆,这没关系。关于公钥加密的妙处在于它是不对称的。加密某物的密钥无法解密,这需要私钥。相反,解密由公共密钥加密的内容的密钥不能用于加密某些内容。因此,CPU生成密钥,使用您存储的公共密钥对密钥进行加密,然后简单地通过USB或RS232或任何您想发送的密钥将其发送出去。阅读私钥需要您的私钥,不需要存储,发送或根本不涉及芯片。一旦用私钥(在芯片外部的其他地方)解密了私钥,就可以进行设置了。您拥有一个安全地传输的密钥,该密钥完全在芯片内生成,而无需存储除公共密钥以外的任何内容-如前所述,根本不需要保护它就不会被读取。
此过程正式称为密钥协商,并且所有事物都使用它。您今天已经使用过几次。有许多资源和库可用于处理它。请不要将钥匙“插入”任何东西。
最后要提的一件事是:所有这些都是没有意义的,因为可以使用侧通道攻击轻松恢复AES密钥,该通道位于电源上,可以测量电流消耗的微小变化以及由CPU翻转引起的这些变化之间的时序作为寄存器。再加上对AES(或可能使用的很小的一组可能的加密算法中的任何一种)如何工作的了解,就可以相对容易和廉价地恢复密钥。它不允许读取密钥,但是可以将密钥空间缩小到非常小的范围,例如255个可能的密钥。该芯片也无法检测到,因为它在上游。
这击败了“安全”加密处理器上的AES-256加密引导加载程序,而且还不那么困难。据我所知,没有真正的硬件对抗措施来应对这种攻击。但是,导致此漏洞的原因是加密算法本身以及它们如何需要CPU翻转位。我怀疑需要开发(并且希望正在开发)抗旁通道算法或旁通道证明算法。
因此,就目前而言,如何安全地将密钥(甚至只是使用临时密钥)存储在嵌入式设备上的真正答案是:您不能。
但是,至少如果您每次在选项4中使用密钥协商每次都生成一个新密钥,那么旁道攻击只会危害正在使用的通道的密钥,并且只有当他们有一段时间在加密数据时监控电源时。如果您经常协商内部生成的新密钥,则可以提供有用的安全性。
生成密钥,并将其存储在尽可能短的时间内。