2、硬件安全模块:OTP(一次性可编程存储器)原理、efuse配置、安全密钥存储

好,咱们进入第二章。这一章讲的是硬件安全模块,说白了就是芯片上那些「焊死」的安全机制。你想想看,软件层面的加密再强,如果硬件本身能被物理攻击,那一切白搭。MTK8678 的硬件安全,核心就靠三个东西:OTP、efuse、还有密钥存储。我一个个说。

2.1 OTP 一次性可编程存储器原理

OTP,全称 One-Time Programmable,一次性可编程。名字很直白——只能写一次,写完就改不了。这玩意儿在安全领域太重要了。

为什么需要 OTP?

因为很多安全参数,比如芯片的唯一ID、根密钥、熔丝配置,一旦确定就不能被篡改。如果这些存在 Flash 里,攻击者可以用 JTAG 或者软件漏洞改掉。但 OTP 是物理层面的「只写一次」,烧进去就焊死了。

OTP 的工作原理

MTK8678 的 OTP 用的是反熔丝(Anti-fuse)技术。正常状态下,存储单元是断开的。编程时施加高压,把绝缘层击穿,形成永久导通。嗯,你可以理解为「烧断一根保险丝」的反向操作——不是断开,而是接通。

关键特性:

  • 一次性写入,不可擦除
  • 写入后数据永久保留(即使断电)
  • 物理不可逆,无法通过常规手段恢复
  • 抗辐射、抗高温,适合工业级环境

我在项目中遇到过一件事。有一次产线反馈,某批芯片的 OTP 写入后校验失败。排查下来,是编程电压时序没卡准,导致部分位没烧透。后来我们加了一个「读回校验」的步骤,写入后立即读出来比对。这个习惯我一直保留到现在。

2.2 efuse 配置详解

efuse 是 OTP 的一种具体实现。MTK 平台里,efuse 用来存储芯片的「硬件配置」和「安全策略」。说白了,它就是芯片出厂时烙下的「胎记」。

efuse 的典型配置项:

配置项 位宽 说明
JTAG 禁用 1 bit 烧写后永久关闭 JTAG 调试接口
安全启动使能 1 bit 强制校验 Bootloader 签名
回退版本限制 4 bits 防止攻击者刷回有漏洞的旧版本
芯片唯一 ID 128 bits 每颗芯片独一无二,用于设备绑定
密钥存储区 256 bits 存放根密钥或密钥派生因子

efuse 的编程流程:

我个人习惯把 efuse 编程分成三步:

  1. 预配置阶段:在安全环境中(比如产线的安全服务器)生成 efuse 的烧写镜像。这一步要反复确认,因为烧错了就废了。
  2. 烧写阶段:通过 AP 或者专门的烧写工具,把数据写入 efuse。注意,MTK 的 efuse 控制器有「写保护」机制,需要先解锁才能写。
  3. 校验阶段:写入后立即读回,比对是否一致。如果不一致,这颗芯片直接报废。

⚠️ 警告:efuse 一旦烧写,不可恢复。我曾经见过一个团队,在量产时把「JTAG 禁用」位提前烧了,结果后续调试完全没法用,只能换芯片。所以我的建议是:先烧非关键位,等整机验证通过后,再烧写「不可逆」的安全位。

2.3 安全密钥存储

密钥存储是硬件安全的核心。你想想看,如果密钥能被软件读出来,那加密算法再强也没用。MTK8678 的密钥存储,走的是「硬件隔离」路线。

密钥存储的层级结构:

MTK 平台把密钥分成三级:

  • 根密钥(Root Key):存储在 efuse 中,256 bits。这是整个信任链的起点。
  • 设备密钥(Device Key):由根密钥派生,存储在 OTP 或安全 RAM 中。每个设备不同。
  • 会话密钥(Session Key):每次启动时动态生成,用于加密通信。用完就丢。

密钥的访问控制:

这里有个关键点:软件不能直接读密钥。MTK 的硬件安全模块(HSM)提供了一个「黑盒」接口。你只能告诉它「用密钥 X 对数据 Y 做 AES 加密」,它把结果返回给你,但密钥本身你拿不到。

举个例子,代码里是这样调用的:

// 伪代码:MTK HSM 密钥使用示例
// 注意:密钥 ID 是硬件索引,不是密钥本身
hsm_status_t status;
uint8_t plaintext[16] = {0x01, 0x02, 0x03, ...};
uint8_t ciphertext[16];

// 使用 efuse 中存储的根密钥(密钥 ID = 0)进行 AES 加密
status = hsm_aes_encrypt(KEY_ID_ROOT, plaintext, 16, ciphertext);
if (status != HSM_OK) {
    // 加密失败,可能是密钥未烧写或硬件故障
    error_handler();
}

你看,代码里只传了密钥 ID,没有传密钥本身。这就是硬件隔离的精髓。

💡 我的经验:在量产时,密钥的烧写和分发是最容易出问题的环节。我建议把密钥烧写放在芯片封测阶段,由封测厂在安全环境中完成。整机组装时,只做「密钥存在性校验」,不接触密钥明文。这样即使整机厂被攻破,密钥也不会泄露。

密钥存储的安全防护:

MTK8678 还加了几层防护:

  • 物理防护:密钥存储区有金属屏蔽层,防止探针攻击。
  • 电压/温度检测:如果检测到异常环境(比如液氮降温),自动擦除密钥。
  • 错误计数:连续多次解密失败,锁定密钥访问。

嗯,这些措施听起来有点「过度设计」,但我在做安全认证(比如 CC EAL5+)时,每一项都是必查项。少一个,认证就过不了。

2.4 避坑指南

最后,我总结几个实际项目中踩过的坑:

  • efuse 烧写顺序:先烧非关键位,最后烧「不可逆」位。给自己留条后路。
  • 密钥备份:根密钥一定要在离线安全环境中备份。我见过有人把密钥存在产线电脑上,结果电脑中毒,所有芯片报废。
  • OTP 容量规划:MTK8678 的 OTP 空间有限,别一股脑全塞进去。先规划好哪些参数必须硬件保护,哪些可以放 Flash。
  • 产线测试:量产时一定要加「OTP 写入校验」步骤。别问我为什么知道——有一批货因为烧写时序问题,20% 的芯片 OTP 数据是错的。

好,这一章就到这里。硬件安全模块是整机安全的基石,你把它搞扎实了,后面的安全启动和加密方案才能站得住脚。下一章我们讲安全启动流程,到时候你会看到,今天讲的 efuse 和密钥,是怎么在启动过程中发挥作用的。