硬件信任根:eFuse与OTP存储、物理不可克隆函数、安全密钥注入流程

大家好,我是你们的嵌入式安全讲师。今天我们来聊聊硬件信任根,也就是 Root of Trust,简称 RoT。这是整个安全体系的基石,说白了,就是芯片的“出生证明”和“身份证”。如果这个根不可信,那上面盖的所有安全楼阁都是空中楼阁。

我个人习惯把硬件信任根比作芯片的“基因”。它必须在芯片制造过程中就被植入,并且要保证绝对不可篡改。为什么?因为一旦芯片启动,所有后续的校验、解密、认证,都要依赖这个最初的信任点。你想想看,如果这个根能被轻易改写,那攻击者就能伪造身份,整个系统就彻底沦陷了。

eFuse 与 OTP 存储:一次编程,终身锁定

先说说最传统的硬件信任根实现方式——一次性可编程存储,也就是 OTP。eFuse 是 OTP 的一种主流实现,它本质上是一根根微小的“保险丝”。

工作原理其实很简单:

  • 芯片出厂时,所有 eFuse 都是连通的(逻辑 0)。
  • 当我们需要写入数据时,通过施加一个较大的电流,把对应的保险丝“熔断”(变成逻辑 1)。
  • 一旦熔断,就再也无法恢复。这就是“一次性”的含义。

我在项目中遇到过一个问题:某次量产时,eFuse 编程的良率突然下降。排查了很久,发现是编程电流的时序没调好,导致部分保险丝熔断不彻底。嗯,这里要注意,eFuse 的编程对电压和温度非常敏感,量产前一定要做充分的工艺角仿真。

核心要点: eFuse 和 OTP 存储的是静态数据,比如芯片的唯一 ID、根密钥的密文、安全配置位等。一旦写入,终身不变。

eFuse 的典型应用场景:

  • 存储根密钥的密文: 真正的根密钥通常不会直接明文存在 eFuse 里,而是存储一个经过硬件加密后的版本。
  • 安全配置位: 比如“是否允许 JTAG 调试”、“是否强制安全启动”等。这些位一旦熔断,就永久锁定了芯片的安全策略。
  • 芯片唯一标识: 用于设备身份认证。
避坑指南: 我曾经见过一个设计,把整个 bootloader 都放在了 eFuse 里。结果发现容量不够,而且一旦写错,整批芯片报废。eFuse 容量很宝贵,只适合存放最关键、最小量的数据。大块代码请放在 ROM 或 Flash 里。

物理不可克隆函数:芯片的“生物指纹”

eFuse 虽然可靠,但它有一个天生的弱点:数据是静态的。如果攻击者通过物理手段(比如聚焦离子束,FIB)探针直接读取 eFuse 的状态,密钥就泄露了。这时候,物理不可克隆函数(PUF)就登场了。

PUF 是什么?说白了,它利用芯片制造过程中不可避免的工艺偏差——比如晶体管的阈值电压、金属线的延迟差异——来生成一个独一无二的“指纹”。

为什么叫“不可克隆”?

  • 即使使用完全相同的掩膜版,在同一片晶圆上,相邻的两个芯片的 PUF 响应也是不同的。
  • 攻击者无法通过逆向工程复制出完全一样的 PUF 行为。
  • PUF 响应是“按需生成”的,平时不存储在芯片中,只在需要时才通过激励-响应对(Challenge-Response Pair, CRP)计算出来。

我个人习惯把 PUF 比作芯片的“生物指纹”。指纹是独一无二的,而且你平时不会把指纹印在纸上到处乱放,对吧?PUF 也是这个道理。

PUF 的典型工作流程:

  1. 注册阶段(Enrollment): 芯片出厂时,向 PUF 输入一个激励(Challenge),PUF 输出一个响应(Response)。这个响应就是芯片的“指纹”。
  2. 辅助数据生成: 由于 PUF 响应受环境(温度、电压、老化)影响会有微小波动,我们需要生成辅助数据(Helper Data),用于后续的纠错。
  3. 重构阶段(Reconstruction): 芯片上电后,再次输入相同的激励,PUF 会输出一个带有噪声的响应。结合辅助数据,通过纠错算法(比如 BCH 码),恢复出原始的、干净的密钥。
我的经验: PUF 不是万能的。它的可靠性受温度影响很大。我在一个车规级项目中,PUF 在 -40°C 和 125°C 下生成的响应差异高达 15%。必须配合强大的纠错电路,否则密钥重构会失败。建议在设计时预留足够的纠错余量。

下面我用一张 SVG 图来展示 PUF 的核心逻辑:

PUF 密钥生成与重构流程 注册阶段(Enrollment) 输入激励 C PUF 响应 R 生成辅助数据 Helper Data 存储:激励 C + Helper Data 重构阶段(Reconstruction) 输入相同激励 C PUF 响应 R' 纠错:R' + Helper Data → R 输出:稳定的根密钥 K 读取存储数据

安全密钥注入流程:从“裸片”到“可信”

有了 eFuse 和 PUF 这些硬件基础,我们还需要一个安全的流程,把密钥注入到芯片中。这个过程,我们称之为“安全密钥注入”或“密钥烧录”。

你想想看,如果密钥在注入过程中被截获,那后续所有安全机制都白费了。所以,这个流程必须设计得滴水不漏。

一个典型的安全密钥注入流程包含以下步骤:

步骤 操作 安全要求
1 芯片进入安全编程模式(通常需要物理引脚或一次性令牌触发) 防止未授权进入编程模式
2 编程器与芯片建立加密通道(如 TLS 或专用对称加密) 防止中间人攻击
3 编程器发送经过加密的密钥材料 密钥在传输过程中不可见
4 芯片内部硬件解密,并将密钥写入 eFuse 或用于 PUF 注册 密钥在芯片内部解密,不暴露在总线上
5 写入完成后,芯片执行自检,验证密钥是否正确 防止写入错误导致芯片变砖
6 永久熔断安全配置位,锁定编程接口 防止后续再次编程或读取密钥
我曾经踩过的坑: 在某次量产中,我们使用了“先烧录密钥,再贴片”的流程。结果发现,芯片在回流焊过程中,eFuse 的状态发生了翻转。后来我们改成了“先贴片,再通过边界扫描(JTAG)烧录”,并增加了温度补偿电路。记住,eFuse 在高温下可能发生数据保持问题,量产流程一定要考虑环境应力。

关于 PUF 的密钥注入,有一点特别值得注意:

PUF 的密钥不是“注入”的,而是“提取”的。芯片出厂时,我们只需要注册 PUF,生成并存储辅助数据。真正的密钥是在芯片每次上电时,由 PUF 电路实时生成的。这意味着,密钥在芯片生命周期中,从未以明文形式存储在任何非易失性存储器中。这是 PUF 相比 eFuse 最大的安全优势。

总结一下我的个人建议:
  • 对于成本敏感、安全等级中等的产品: 使用 eFuse 存储根密钥密文,配合片上硬件解密引擎。
  • 对于高安全等级、需要防物理攻击的产品(如车规域控制器、金融支付终端): 强烈建议使用 PUF。虽然成本稍高,但安全性提升了一个量级。
  • 密钥注入流程一定要有物理安全措施: 比如在安全环境中进行,编程设备要有防篡改设计,注入完成后要销毁临时密钥。

好了,关于硬件信任根的内容就讲到这里。记住,信任根是整个安全体系的基石,这块做扎实了,后面的安全启动、固件加密才能站得住脚。希望今天的分享对你有帮助。


专注资料整理