2、信任根(RoT)建立:硬件信任锚点与根密钥烧录

安全启动的根基,说白了就是「第一级信任从哪来」。

你想想看,整个启动链像一条锁链——BootROM 验证 Bootloader,Bootloader 验证内核,内核验证文件系统。但这条锁链的第一环,谁来验证?没人验证。它必须是天生可信的。

这就是信任根(Root of Trust, RoT)。我做了这么多年嵌入式安全,见过太多项目在 RoT 上翻车。有的芯片出厂后才发现 eFuse 没烧对,整批报废。有的 BootROM 有硬件漏洞,攻击者直接跳过验证。嗯,这一章咱们就把 RoT 的每个坑都踩一遍。

2.1 硬件信任锚点:eFuse 与 OTP

硬件信任锚点,就是芯片上那块「一次写入、永久生效」的存储区域。常见的有两种:eFuse 和 OTP ROM。

特性 eFuse OTP ROM
写入方式 电迁移熔断(一次性) 高压击穿(一次性)
存储密度 较低(每位一个熔丝) 较高(类似 ROM 阵列)
读取速度 快 快
物理安全性 中等(可被探针检测) 较高(不易逆向)
典型容量 128 bit ~ 8 Kbit 512 bit ~ 64 Kbit
常见用途 密钥存储、芯片 ID、配置位 根密钥、安全配置、生命周期
我的经验:我个人习惯在 eFuse 里只存根密钥的哈希,而不是密钥本身。密钥本体放在更安全的内部 SRAM 中,由 BootROM 从 eFuse 读取哈希后比对。这样即使 eFuse 被物理破解,攻击者也拿不到原始密钥。

2.2 BootROM 的不可篡改性

BootROM 是芯片上电后执行的第一段代码。它固化在芯片内部,出厂后无法修改。这就是「不可篡改性」的物理基础。

但不可篡改 ≠ 绝对安全。我在项目中遇到过一个问题:某款芯片的 BootROM 里有一段「调试后门」代码,用于工厂测试。结果攻击者通过电压毛刺攻击,让芯片误以为处于测试模式,直接跳过了签名验证。

避坑指南:我曾经在评审一款 IoT 芯片时发现,它的 BootROM 居然支持从外部 SPI Flash 加载「补丁」代码。这等于把信任根的钥匙交给了攻击者。记住:BootROM 必须只执行内部固化的逻辑,不能有任何外部加载路径。

BootROM 的不可篡改性依赖于芯片的物理设计:

  • 掩膜 ROM:制造时直接刻入,无法修改
  • 一次性可编程(OTP):出厂后锁定,无法回退
  • 硬件安全模块(HSM):独立的安全岛,BootROM 运行在隔离环境中

嗯,这里要注意:有些芯片厂商为了「灵活性」,会在 BootROM 里留一个「安全更新」接口。我个人强烈建议——量产前必须把这个接口永久关闭。否则它就是一颗定时炸弹。

2.3 根密钥对生成与烧录

根密钥对是安全启动的「终极信任」。它通常是一对 RSA 或 ECC 密钥:私钥用于签名固件,公钥烧录到芯片的 OTP/eFuse 中。

2.3.1 密钥生成的最佳实践

我见过太多团队直接在开发机上用 OpenSSL 生成密钥,然后复制到 U 盘里到处传。这太危险了。正确的做法是:

  1. 使用硬件安全模块(HSM)生成密钥——私钥永远不离开 HSM
  2. 如果不用 HSM,至少用离线电脑——断网、无蓝牙、无 WiFi
  3. 生成后立即备份私钥——用 Shamir 秘密共享分片存储
  4. 销毁生成环境——格式化硬盘,物理销毁
核心原则:根私钥一旦泄露,整个产品线的安全就归零了。你无法通过 OTA 更新根密钥,因为信任链已经被破坏。

2.3.2 烧录流程与验证

根公钥烧录到 eFuse/OTP 的过程,必须严格受控。我建议的流程如下:

# 1. 在 HSM 中生成密钥对
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
  -out root_private.pem -engine pkcs11

# 2. 导出公钥
openssl rsa -pubout -in root_private.pem -out root_public.pem

# 3. 计算公钥哈希(用于烧录验证)
openssl dgst -sha256 -binary root_public.pem | xxd -p

# 4. 烧录到 eFuse(示例命令,实际由芯片厂商工具完成)
efuse_program --address 0x00 --data root_public_hash.bin

# 5. 回读验证
efuse_read --address 0x00 --length 32 | cmp - root_public_hash.bin
避坑指南:我曾经遇到一个案例——工厂烧录时,操作员把公钥哈希写反了字节序(大端 vs 小端)。结果芯片启动时 BootROM 计算的哈希和 eFuse 里的永远对不上。整批 10 万片芯片需要返工。所以,烧录后一定要做「签名-验证」闭环测试:用私钥签一个测试镜像,让芯片验证能否启动。

2.4 信任根建立的整体流程

下面这张图展示了 RoT 建立的完整逻辑。我把它画成流程图,方便你理解各环节的依赖关系。

信任根(RoT)建立流程 阶段1:芯片设计 BootROM 固化 / OTP 布局 阶段2:密钥生成 HSM 生成根密钥对 阶段3:公钥烧录 写入 eFuse/OTP 阶段4:闭环验证 签名测试镜像 → 启动验证 阶段5:永久锁定 关闭调试接口 / 熔断 eFuse 关键原则 • 私钥永远不离开 HSM 或离线环境 • 公钥烧录后必须做签名-验证闭环测试 • 量产前永久锁定所有调试接口和 OTP 写保护

2.5 常见陷阱与对策

做 RoT 这么多年,我踩过的坑和见过的坑可以列一张长清单。这里挑几个最要命的:

陷阱 后果 对策
eFuse 烧录后未回读验证 位错误导致密钥无效,芯片变砖 烧录后必须回读并与原始数据逐位比对
BootROM 存在未关闭的调试接口 攻击者通过 JTAG/SWD 读取 eFuse 内容 量产前永久熔断调试接口对应的 eFuse
根密钥在开发环境生成 私钥可能被恶意软件窃取 使用 HSM 或离线专用电脑生成
公钥哈希字节序错误 签名验证永远失败 烧录前用测试镜像做闭环验证
OTP 容量不足 无法存储多个密钥或配置 设计阶段预留足够 OTP 空间(建议至少 2KB)
我的习惯:每次 RoT 建立完成后,我会做三件事:1)用逻辑分析仪抓取 BootROM 的启动波形,确认没有异常跳转;2)尝试用电压毛刺、时钟毛刺攻击芯片,看 BootROM 是否会被绕过;3)做一次「暴力测试」——烧录一个错误签名的固件,确认芯片确实拒绝启动。这三步走完,我才敢说 RoT 是可靠的。

嗯,信任根建立是整个安全启动中最不能出错的一环。它就像大楼的地基——地基歪了,上面盖得再漂亮也没用。我见过太多团队把精力花在后面的签名算法、镜像加密上,却忽略了 RoT 本身的安全性。结果呢?攻击者直接从 BootROM 下手,绕过了所有防护。

记住一句话:信任根不可信,则一切安全皆为空谈。