密码保护嵌入式固件下载

Pra*_*ian 0 c c++ embedded cryptography public-key-encryption

我需要防止我们产品的用户下载与他们尝试下载的硬件版本不兼容的固件.我将描述现在存在的东西以及我正在寻找的东西.

我们有一个字母数字硬件部件号和修订版存储在EEPROM中,只能在工厂编程.当客户尝试下载固件文件时,他必须输入随固件版本一起分发的密码.现有固件需要能够使用此密码来验证新固件是否与当前硬件版本兼容.请记住,多个硬件版本可能与单个已发布的固件版本兼容.

是否存在某种形式的公钥加密,可用于验证固件构建过程中生成的密钥的多个硬件版本号?硬件版本号将作为私钥,而客户输入的用于解锁下载机制的密码将是公钥.

嵌入式固件是用C语言编写的,如果加密算法相同则会很好.它可以是C++,只要它有一个适合从C函数调用的接口.

有一些硬件版本在野外,但我们可以忽略现在存在的那些.假设将发布包含此功能的全新产品,因此它将是0版.

密码将从客户端的计算机传输到嵌入式硬件,无需任何修改.因此,解密和密码匹配需要在嵌入式固件中进行,然后嵌入式固件将成功/失败报告给客户端.这样做的原因是它可能并不总是用于下载固件的笔记本电脑.它更可能是一个手持式下载工具,因此执行自定义软件的选项有限.

caf*_*caf 6

忘记密码.

最简单的方法是在固件文件中,在已知位置包含兼容硬件ID列表.这可以存储为长度前缀数组.当要将新固件加载到设备中时,设备会在列表中查找自己的硬件ID,如果不存在,则拒绝该固件.

这样的系统健壮,易于理解且易于调试.如果空间是一个问题,那么您可以将列表存储为bitset,每个硬件版本分配一点.

如果您希望防止主动篡改,您可以使用普通公钥签名算法(如DSA或RSA)进一步签署整个固件文件,包括兼容硬件ID列表.

  • @Praetorian:为什么你不能使用包含兼容硬件ID列表的未刻录到闪存部分的固件部分进行刻录?加载器开始读取数组,检查条目然后将数据丢弃 - 然后当它到达固件的正常启动时,它开始将其刻录到闪存中(但只有当它看到匹配的硬件ID时第一部分转移). (4认同)