2、硬件信任根设计:PUF原理、OTP存储、安全密钥注入、防篡改设计

大家好,我是你们的嵌入式安全架构师。今天咱们聊聊硬件信任根——说白了,就是芯片的“出生证明”和“防伪标签”。

我做了这么多年IoT芯片,发现一个残酷的事实:没有硬件信任根,你的加密算法再强也是白搭。攻击者可以直接从Flash里把密钥读出来,你连哭的地方都没有。

2.1 物理不可克隆函数(PUF)

PUF是什么?我习惯叫它“芯片的指纹”。每颗芯片在制造时,由于工艺偏差,内部晶体管的阈值电压、金属线的延迟都会有微小差异。PUF就是利用这些差异,生成一个唯一的、不可预测的“指纹”。

你想想看,同一批晶圆上切下来的芯片,理论上是一样的。但实际测量时,每颗芯片的PUF响应都不同。这就是“物理不可克隆”的含义——你无法复制另一颗完全一样的芯片

2.1.1 常见的PUF类型

类型 原理 典型应用
SRAM PUF 利用SRAM上电时单元的随机初始值 密钥生成、芯片ID
环形振荡器PUF 利用振荡器频率的工艺偏差 密钥生成、认证
蝴蝶型PUF 利用交叉耦合结构的亚稳态 高安全性场景
仲裁器PUF 利用路径延迟差异 轻量级认证

我在项目中用得最多的是SRAM PUF。为什么?因为它不需要额外电路,直接用芯片已有的SRAM就行。成本几乎为零。

核心要点:PUF不是存储密钥,而是“生成”密钥。密钥只在需要时出现,用完后消失。攻击者无法通过物理探针获取密钥。

2.1.2 PUF的可靠性问题

嗯,这里要注意。PUF虽然好,但它有个毛病——不稳定。温度变化、电压波动、芯片老化,都会导致PUF输出出现比特翻转。

我曾经遇到过一批芯片,在实验室测试时PUF响应完美。结果到了客户现场,温度一高,密钥就变了。系统直接锁死,客户差点把设备砸了。

解决方案是什么?

  • 纠错码(ECC):用BCH码或Reed-Solomon码纠正翻转的比特
  • 模糊提取器(Fuzzy Extractor):将PUF响应映射到稳定的密钥
  • 辅助数据:在OTP中存储纠错信息,但不泄露密钥

避坑指南:我曾经在SRAM PUF上吃过亏——上电后要等100ms再读PUF值,否则SRAM还没稳定,读出来的全是噪声。加个延时,问题就解决了。

2.2 一次性可编程存储(OTP)

OTP,顾名思义,只能写一次。写进去就不能改,也不能擦除。这听起来很蠢,但恰恰是它的优势——攻击者无法篡改

我习惯把OTP比作“芯片的纹身”。一旦纹上去,就跟你一辈子。想改?除非把芯片砸了。

2.2.1 OTP的实现方式

类型 原理 特点
熔丝型 用大电流烧断金属丝 可靠,但需要高压
反熔丝型 用高压击穿绝缘层 面积小,但工艺复杂
电学型 利用浮栅晶体管 兼容标准CMOS工艺

我个人偏好反熔丝型OTP。虽然工艺复杂,但可靠性高,而且不容易被逆向工程。熔丝型OTP有个问题——用显微镜就能看到哪些熔丝断了,密钥一目了然。

2.2.2 OTP中存什么?

  • 根密钥:芯片最核心的密钥,所有其他密钥都由它派生
  • 芯片ID:唯一标识,用于认证和追踪
  • 安全配置:如调试接口是否关闭、哪些区域可读
  • PUF辅助数据:用于纠错的冗余信息

警告:OTP空间非常宝贵。一颗芯片可能只有几百比特的OTP。设计时一定要精打细算,别把无关数据写进去。我见过有人把固件版本号也存OTP里,简直是浪费。

2.3 安全密钥注入

密钥怎么进芯片?这是个大学问。你不能在生产线上把密钥明文传过去,否则中间人一抓包,密钥就泄露了。

我参与过的一个项目,客户要求密钥注入必须在芯片封装之后进行。为什么?因为封装前,晶圆上的探针可以直接接触芯片内部,攻击者也能。封装后,只有有限的引脚暴露出来,攻击面小得多。

2.3.1 密钥注入流程

  1. 芯片生成密钥对:芯片内部生成RSA或ECC密钥对,公钥通过安全通道传出
  2. 服务器加密密钥:密钥管理服务器用芯片的公钥加密根密钥,发送给芯片
  3. 芯片解密并存储:芯片用私钥解密,将根密钥写入OTP
  4. 验证:芯片用根密钥签名一个随机数,服务器验证签名是否正确

关键点:整个过程中,私钥从未离开芯片。攻击者即使截获了通信数据,也无法解密出根密钥。

2.3.2 注入时的防篡改措施

  • 物理屏蔽:在芯片上方覆盖金属层,防止探针直接接触内部总线
  • 电压/温度监控:检测到异常电压或温度时,立即擦除密钥
  • 时间窗口:密钥注入必须在规定时间内完成,超时则锁定
  • 一次性注入:注入完成后,永久关闭注入接口

我曾经遇到过一个问题:生产线上有一台设备坏了,导致一批芯片的密钥注入失败。结果那批芯片的注入接口已经关闭,无法重新注入。最后只能报废。所以,一定要在注入完成后再关闭接口,别急着关。

2.4 防篡改设计

防篡改,说白了就是让攻击者“碰不得”。你碰一下,芯片就自毁。或者至少让攻击者拿不到有用的信息。

2.4.1 主动防护层

芯片最上层会覆盖一层金属网格。这层网格平时通着电,一旦被切断(比如被探针刺穿),芯片会检测到电流变化,立即触发安全响应。

我见过最狠的设计是:防护层被破坏后,芯片不仅擦除密钥,还会把整个OTP区域烧掉。物理上彻底摧毁数据。

2.4.2 环境传感器

传感器类型 检测目标 触发动作
光传感器 芯片被开盖(暴露在光线下) 擦除密钥
温度传感器 液氮冷却(用于故障注入) 锁定芯片
电压传感器 电压毛刺(用于故障注入) 复位或擦除
频率传感器 时钟毛刺(用于故障注入) 停止运行

避坑指南:我曾经设计过一个温度传感器,阈值设得太低。结果芯片在正常工作时,夏天温度一高就触发保护,系统频繁重启。后来把阈值调高了10度,问题解决。记住:防篡改不能影响正常功能

2.4.3 安全状态机

芯片内部有一个安全状态机,管理着芯片的生命周期:

  • 测试模式:出厂前,所有功能可访问
  • 密钥注入模式:只允许密钥注入操作
  • 安全模式:正常运行时,调试接口关闭,OTP只读
  • 失效模式:检测到攻击,芯片永久锁定

状态转换是单向的,只能向前,不能后退。一旦进入安全模式,就再也回不去测试模式了。这是为了防止攻击者通过调试接口获取密钥。

2.5 知识体系总览

下面这张图,是我自己画的。它把硬件信任根的四个核心模块串起来了:

硬件信任根设计框架 硬件信任根 PUF 物理不可克隆函数 OTP存储 一次性可编程 密钥注入 安全分发 防篡改 主动防护 PUF生成密钥 → OTP存储 OTP存储密钥 → 密钥注入 密钥注入 → 防篡改保护 核心逻辑: PUF生成唯一密钥 → OTP安全存储 → 密钥注入确保分发安全 → 防篡改保护全生命周期 四个模块缺一不可,共同构成芯片的安全根基

这张图我画了好几次才满意。你看,四个模块是环环相扣的:PUF生成密钥,OTP存储密钥,密钥注入把密钥安全地放进去,防篡改保护整个过程。缺一个,信任根就不完整。

2.6 实战经验总结

做了这么多年,我总结了几条铁律:

  • 别信软件:软件可以被篡改,硬件信任根才是最后的防线
  • 别信外部存储:密钥必须留在芯片内部,别放到Flash或EEPROM里
  • 别信调试接口:量产时一定要关闭JTAG/SWD,否则攻击者可以直接读取内存
  • 别信一次测试:PUF的可靠性测试要做100次以上,覆盖不同温度和电压

最后说一句:硬件信任根不是万能的,但没有它是万万不能的。攻击者可以攻破任何系统,但有了硬件信任根,他们需要付出极高的成本。对于大多数IoT设备来说,这就够了。


公众号:蓝海资料掘金营,微信deep3321