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 编程分成三步:
- 预配置阶段:在安全环境中(比如产线的安全服务器)生成 efuse 的烧写镜像。这一步要反复确认,因为烧错了就废了。
- 烧写阶段:通过 AP 或者专门的烧写工具,把数据写入 efuse。注意,MTK 的 efuse 控制器有「写保护」机制,需要先解锁才能写。
- 校验阶段:写入后立即读回,比对是否一致。如果不一致,这颗芯片直接报废。
⚠️ 警告: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 和密钥,是怎么在启动过程中发挥作用的。