使用加密的外部 EEPROM 保护嵌入式系统中的数据
投稿人:DigiKey 北美编辑
2019-01-17
一些微控制器配有片载 EEPROM,这样既提供了非易失性数据存储器,还能节省板空间。然而,随着数据安全变得愈发重要,许多现代嵌入式系统需要一种实用的方法,利用非易失性存储器来安全地存储数据,同时还可抵御外部黑客的攻击。
本文将介绍如何利用单芯片安全 EEPROM 来抵御黑客攻击,安全地存储非易失性数据,而不过多地涉及详细的加密功能。相反,本文将介绍一款来自知名供应商的合适的安全 EEPROM 示例,并描述该 EEPROM 的工作原理和应用方式。
有关安全 EEPROM 的需求
许多嵌入式系统都得益于非易失性数据存储器,而 EEPROM 便是典型的代表之一。与掉电时失去状态的 RAM 相比,EEPROM 可在系统掉电时依靠固件控制来执行读写操作并保持其状态。
虽然微控制器内的 EEPROM 总是会有助于存储那些掉电时须保留的程序数据,但这种存储器通常存在与 RAM 相同的安全漏洞。在一些现代的 8 位、16 位和 32 位微控制器中,有一些安全方法可以避免在固件控制下读取数据存储器区域,或阻止调试器等外部接口读取数据。在过去,这种安全性可能称得上足够充分,但如今,在许多情况下,黑客可能拥有足够的资金、时间、动机和资源来绕过这种看似充分的安全性,获得对关键系统的访问权限。
如今,现代嵌入式系统已发展到许多应用需要更强大数据保护能力的程度。在一些物联网节点、安防系统、车到车通信、现代医疗设备和自主驾驶车辆中尤其如此。仅仅是预防系统克隆也可能需要数据安全性。在一些应用中,如果 EEPROM 数据因为受到恶意黑客的成功攻击而造成泄露,可能会导致财产损失或更糟糕的情况发生。
在这类情况下,EEPROM 需要用于强有力地防御拥有大量资源的黑客。这时可使用具有高安全性的 EEPROM,它能轻松地对密码、克隆哈希、指纹数据、传感器校准信息以及生物识别数据等敏感数据进行加密。
Microchip Technology 已凭借一系列 CryptoAuthentication™ 器件解决了这一设计问题。如果这些器件听起来很熟悉的话,那是因为 Microchip 是通过收购 Atmel 延续了该产品系列。ATAES132A 32 KB 安全 EEPROM 就是来自该系列的前述器件之一(图 1)。
图 1:ATAES132A 32 KB 串行 EEPROM 专门设计有安全功能,可用于保护数据和内部寄存器。(图片来源:DigiKey)
ATAES132A 可以像任何标准 32 KB 串行 EEPROM 一样使用。该器件采用标准 SPI 和 I2C 引脚分配,因此无需任何硬件修改便能替换现有设计中的标准串行 EEPROM。这样一来,现有设计只需修改应用固件,便可轻松升级额外的安全性。
此外,该器件还具有显著的物理保护功能、加密功能和其他融入设计的安全功能;启用这些功能后,将可以保护 EEPROM 数据和内部寄存器免受最顽固的黑客以外的所有黑客攻击。数据可以通过使用军用级 AES 加密技术(最多 16 个 128 位密钥)进行保护。
物理保护
首先,ATAES132A 具有许多机械安全机制,可防止器件受到物理上的反向工程。该器件对环境温度的某些变化很敏感,例如试图“深度冻结”器件以维护存储器内容等。它还能检测试图暴露芯片的去盖尝试。金属屏蔽可以遮盖芯片,如果将其移除,芯片将可以检测其是否曝露于光线中,而这种曝光可能引发破坏存储器内容的机制。
最后,存储器内容得到加密。该器件还可能包括只有 Microchip 工程师才知道的未公开安全机制,因为 Microchip 会对这些安全机制的细节保密,这就为安全存储器提供了广泛的物理安全性,无需开发人员构建复杂的外壳来提供 EEPROM 屏障。
上电时,可将 ATAES132A 配置为使用 SPI 或 I2C 接口对接至大多数微控制器。当采用 I2C 模式时,不使用片选引脚,并且必须将该引脚连接到电源或接地。当配置用于 SPI 模式时,按照常规会使用片选引脚。
AES 数据加密
通过将 AES-CCM 与 128 位密钥一起使用,可在 ATAES132A 上实现加密。简而言之,针对将要加密的数据引入一系列复杂的数学函数处理,使得这些数据与固件开发人员所设定的 128 位数字进行组合。AES 加解密操作过程中执行的复杂数学运算均由 ATAES132A 完成,而且除了设置一些变量和选择 128 位密钥外,此过程对固件开发人员而言是透明的,从而大大简化了产品开发。
ATAES132A 存储器映射
该器件可以简单地用作标准非加密串行 EEPROM。但如果开发人员使用高级安全功能,则器件的结构和使用方式会有很大差别。要了解 ATAES132A,最快捷的方法是检查存储器映射,如表 1 所示,该映射比标准 EEPROM 的映射更加深入。
|
表 1:ATAES132A 存储器映射比标准串行 EEPROM 映射更深入。(数据来源:Microchip Technology)
此存储器映射中的大多数位置都是使用标准 I2C 或 SPI 命令读取或写入的。
EEPROM 和存储区安全配置寄存器
这款 32 KB 数据 EEPROM 存储器被分为 16 个 2 KB 存储区。每个存储区都可以单独配置安全性(或不配置安全性)。16 个存储区分别在存储区安全配置寄存器区域设置安全性设置。以下是可以为 16 个 2 KB 存储区分别单独设置的基本安全性设置:
- 启用/禁用加密以读取数据
- 启用/禁用加密以写入数据
- 启用/禁用身份验证以读取数据
- 启用/禁用身份验证以写入数据
- 将存储区永久设置为只读
在设置应用的安全性时,这些设置项能够提供极大的灵活性。一个存储区可以设置为不使用加密、不对读/写访问进行身份验证,从而允许像任何标准 EEPROM 一样进行读写。另一个存储区则可能要求进行完全加密和身份验证,从而为敏感数据提供高安全性。
器件配置寄存器
器件的一般特性可在器件配置寄存器区域设置。此区域还包含关于器件的一些只读信息,包括用于标识器件的唯一 32 位器件序列号。其他寄存器允许将存储区或其他寄存器设为只读,也称为锁定存储器。一旦锁定某个寄存器或存储区,将是永久性锁定,永远无法解锁。
此区域还有 I2CAddr 寄存器,用于配置器件是在 I2C 模式还是 SPI 模式下使用。器件上电时会写入 1 个字节的 I2CAddr 寄存器。I2CAddr 的 0 位决定串行接口模式。如果固件写入 0,则将器件配置为 SPI 模式。如果写入 1,则选择了 I2C 模式。如果选择了 I2C 模式,7 位器件地址为 50h。
命令和响应存储缓冲区
虽然可以使用标准 SPI 或 I2C 寻址来访问器件中的存储器位置,但器件也接受类似于微控制器的命令。命令及其操作数(称为“命令块”)可能是一个或多个字节,并且始终直接写入到位于地址 FE00h 的命令和响应存储缓冲区。命令块由一个单字节指令、一个或多个字节的操作数和一个 2 字节校验和组成。
可用命令包括数据验证、来自 EEPROM 存储区的块读取、递增计数器,以及直接读取任何需要验证的受保护存储器或寄存器。命令响应可从同一位置 FE00h 读回。FE00h 的所有写入均是发送到命令存储缓冲区的命令,来自 FE00h 的所有读取均来自响应存储缓冲区。
位于 FFE0h 的 I/O 地址复位寄存器是一个只写寄存器,用于复位命令和响应存储缓冲区。向 FFE0h 写入任何值都需要执行两项操作:将命令存储缓冲区清除,以便可以接受新的命令块;将响应存储缓冲区复位至零,以便可以从头开始读取内容。
复位响应存储缓冲区可允许固件重新读取整个响应。这在以下代码中可能非常有用:代码中发生中断时主机微控制器正在读取响应存储缓冲区,而且在从中断恢复时需要从头开始重新读取数据。
此外,还有一些命令可针对 EEPROM 的读写操作执行 AES 加密和解密。这些计算极其复杂,本文将不予讨论。不过,Microchip 提供的微控制器驱动程序和固件可以轻松执行所有这些功能,因此程序员只需了解很少的 AES 加密知识即可。
存储区计数寄存器
该寄存器区域包含 16 个与各存储区关联的只读计数器。各存储区均使用其 128 位存储区密钥完成加密或解密。每次使用存储区密钥时,关联的 32 位存储区计数器可能递增也可能不会递增,具体取决于关联的存储区计数器配置寄存器中的设置。出于安全目的,计数器永远不会递减或复位。
固件可以直接写入存储区计数器,以将其递增到初始值,但绝不可递增到低于现有计数器内容的值。制造期间可以写入并锁定存储区计数器,以限制计数数量。当计数器达到最大值 2,097,151 时,可以永久禁用关联的密钥,以防止使用该密钥执行进一步的加密或解密操作。这对于有限使用密钥可能非常有用,例如,允许重新闪存微控制器固件有限的次数。
为实现额外的安全性,每个 32 位存储区计数器都是重复的,这样做是为了在存储区计数器递增期间发生电源故障的情况下,可以检测存储区计数器是否损坏。应用上电时,固件应读取所有存储区计数器的两个计数器值。如果在某个耐用型应用中这两个值不同,则证明存在未经授权的掉电事件,而这可能表明有人在未经授权的情况下试图在应用运行时禁用其安全功能。
状态寄存器
ATAES132A 状态寄存器为只读寄存器,用于指示包括错误的校验和命令错误在内的错误代码,还可以指示 ATAES132A 是处于 I2C 模式还是 SPI 模式,以及命令的进度和响应的有效性。该寄存器应在所有读取、写入、命令和响应前后进行读取。错误可能指示干扰主机微控制器和 ATAES132A 之间的 I2C 或 SPI 连接的外部企图。出现错误时,采取哪种通知方式取决于主机固件,例如提示操作员或发出警报。
在制造过程中设置 ATAES132A
ATAES132A 器件的安全性应在最终产品制造过程中进行设置。为减少发生配置错误的可能性,应在系统内完成 ATAES132A 的配置。首先,应对计数器的所有初始值及其配置进行设置,接着,应对密钥和加密参数进行编程,最后,应对 EEPROM 的所有初始值进行编程。唯一的 32 位器件序列号可以从 ATAES132A 进行读取,以便其能合并到主机微控制器固件中。
建议回读所有已编程的 EEPROM 值,以确保正确配置 ATAES132A。如果未能正确回读任何值,或者状态寄存器指示校验和或命令错误,则应标记最终产品并从生产中移除。如果有足够的备用 EEPROM,则可以选择执行加密和解密测试。
ATAES132A 开发
为帮助开发,Microchip 提供了 DM320109 Xplained-Pro CryptoAuthentication 入门套件(图 2)。ATAES132A 可以连接到 Microchip ATSAMD21J18A Arm® Cortex®-M0+ 微控制器。
图 2:Microchip 的 DM320109 Xplained CryptoAuthentication 入门及开发套件提供了一种简单的方式来评估和开发 ATAES132A 代码。该套件配有大量代码示例,可以与大多数支持 Windows、Linux 或 MacOS 的 PC 连接。(图片来源:Microchip Technology)
Microchip 的 ATSAMD21J18A 微控制器配有 USB 接口,可与 PC 开发环境连接。该控制器既支持 I2C 接口,也支持 SPI 接口,两种接口均可用于连接 ATAES132A。使用随附的 USB 电缆连接到目标 PC 后,可使用该套件来配置和监控 ATAES132A 的所有功能。
提供的第二根 USB 电缆可用于监控并记录 ATAES132A 和 ATSAMD21J18A 之间的数据包。此电缆一端连接 Xplained 电路板,另一端连接 PC 上的可用 USB 端口。然后,开发人员可以监控微控制器和 EEPROM 之间的信号,观察两个器件之间移动的加密数据。
Xplained 套件附带了 ATAES132A 的所有固件库和示例代码。在充分了解本文描述的 ATAES132A 存储器映射和寄存器之后,开发人员即便对器件加密知之甚少,也能轻松地自定义示例代码,以符合其目标应用。
结论
AES 128 位加密是一个复杂的主题。尽管如此,开发人员仍可以在专为此目的而设计的 EEPROM 中保护敏感数据。而这有赖于机械保护、强加密、特殊分区和存储器映射,以及只有公司和/或最终用户知道的自定义或机密功能。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。