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