1. 项目概述与核心价值
在物联网设备遍地开花的今天,安全问题已经从“加分项”变成了“生死线”。我接触过不少项目,前期功能跑得飞起,一到安全审计或者实际部署阶段,各种密钥泄露、固件被篡改的问题就全暴露出来了。核心痛点往往不在于用了多复杂的算法,而在于最基础的 密钥如何安全地生成、存储和使用 。传统的做法是把密钥烧录到芯片的OTP(一次性可编程)存储器或者外部安全芯片里,但这带来了供应链管理复杂、成本增加和物理攻击风险。
这次我们要聊的**SRAM PUF(物理不可克隆函数)**技术,提供了一种思路完全不同的解法。它不“存储”密钥,而是利用每一颗芯片在制造过程中都无法避免的、微小的物理差异,在每次上电时动态“生成”一个独一无二的密钥。这就像是用芯片的“指纹”来开锁,指纹本身并不存储,攻击者自然无从窃取。NXP的i.MX RT1050系列跨界MCU,凭借其高性能和丰富的外设,成为了验证这类前沿安全方案的理想平台。结合Intrinsic ID公司的BroadKey软件库,我们能在资源受限的嵌入式端,实现一套从密钥生成、封装、使用到销毁的全生命周期硬件级保护方案。这篇文章,我就以一个实际开发者的视角,带你深入这套方案的里里外外,从原理剖析到在RT1050 EVK评估板上的实操,把关键步骤和踩过的坑都摊开来讲清楚。
2. 硬件保护密钥与SRAM PUF技术深潜
2.1 为什么传统密钥存储方式是阿喀琉斯之踵?
在深入PUF之前,我们必须先理解传统方法的短板。嵌入式系统的密钥保护,通常有几个层级:
- 软件存储 :密钥以明文或简单加密的形式存放在Flash中。这是最危险的方式,通过调试接口或内存dump可直接获取。
- OTP/Fuse存储 :将密钥烧录进芯片内部的熔丝或OTP存储器。安全性提升,密钥无法通过软件直接读取。但问题在于: 密钥一旦烧录便永久存在 于硅片中,面临物理逆向工程(如微探针)的风险;同时,供应链上需要进行密钥注入,流程复杂且存在泄露风险。
- 外部安全元件(SE) :使用独立的、通过安全认证(如CC EAL5+)的芯片专门负责密钥管理。这是目前安全等级最高的方式之一,但带来了额外的BOM成本、PCB面积和通信开销。
所有这些方法都有一个共同点: 密钥作为一个静态的、明确的数据实体,存在于设备的某个物理位置 。安全的目标就变成了如何加固这个“藏宝地点”。而PUF的思路是釜底抽薪: 根本不藏宝,而是让设备自己现场画一张只有它能看懂的“藏宝图” 。
2.2 SRAM PUF:从物理熵到密码学密钥的魔法
SRAM PUF的核心原理,巧妙利用了半导体制造中的一个“缺陷”——工艺偏差。在纳米级的晶体管制造中,栅极长度、氧化层厚度等参数存在微观的、随机性的波动。这种波动对于数字电路的功能没有影响,但却会导致每个SRAM存储单元(通常由6个晶体管构成)在上电瞬间,有一个稳定的倾向进入“0”或“1”状态。
这个过程可以拆解为四个关键步骤:
- 工艺偏差(Process Variation) :这是物理熵的来源。每一颗芯片,甚至同一芯片上的不同SRAM单元,其晶体管特性都存在独一无二的微小差异。
- SRAM上电值(SRAM Start-up Values) :当SRAM区块从完全断电状态上电时,每个单元会基于其晶体管的物理特性,随机但确定地稳定到“0”或“1”。注意,这里的“随机”是对不同芯片而言的,“确定”是对同一芯片的同一单元而言的——每次上电,它都会稳定到同一个状态。
- 硅指纹(Silicon Fingerprint) :将一大片SRAM(通常是数千比特)的上电状态值连接起来,就构成了一个该芯片独一无二的、稳定的“指纹”二进制串。这个指纹具有极高的熵值。
- PUF密钥生成 :原始的SRAM上电模式(称为“原始响应”)并非完美的密钥,它可能含有少量不稳定的比特(噪声)。因此,需要通过一种称为“模糊提取器”的算法进行处理。该算法在初始“注册”阶段,会生成一段公开的、非秘密的“辅助数据”(Helper Data)。之后在每次“重建”密钥时,结合当前的SRAM上电模式和辅助数据,就能确定性地重构出完全一致、高熵的密码学密钥。
关键优势在于 :芯片中 永不存储 真正的密钥。存储的只是公开的“辅助数据”。即使攻击者窃取了辅助数据,没有这块特定的SRAM物理实体,也无法恢复出密钥。密钥仅在需要时存在于SRAM和CPU寄存器中,使用后即消失,极大缩短了密钥暴露在攻击窗口下的时间。
2.3 Intrinsic ID BroadKey:将PUF能力产品化的软件库
理解了原理,我们还需要一套可靠的工程实现。Intrinsic ID的BroadKey就是一个将SRAM PUF技术封装成易用API的软件库。它主要提供以下核心功能:
- 密钥衍生 :从SRAM PUF的熵源中,衍生出密码学强度的对称密钥(如AES-256)或非对称密钥对(如ECC P256)。
- 随机数生成 :提供基于PUF熵源的真正随机数生成器(TRNG),用于各种安全协议。
- 密钥封装 :这是BroadKey的核心价值之一。你可以用它生成的PUF密钥,去加密(封装)另一个应用密钥(例如一个用于加密文件的AES密钥)。被封装后的密钥可以安全地存储在外部Flash等非易失性存储器中。需要使用时,再用PUF密钥解密(解封装)。这样,应用密钥的安全完全依赖于PUF密钥的安全。
- 密码学操作 :支持基于衍生密钥的ECDSA签名/验证、ECDH密钥协商等操作。
BroadKey库本身经过了严格的安全设计,包含了对抗侧信道攻击(如功耗分析、时序分析)的防护措施,并且其设计旨在满足FIPS 140-2等相关标准的要求。
3. 基于i.MX RT1050的SRAM PUF安全方案实战
3.1 平台选型:为什么是i.MX RT1050?
NXP的i.MX RT1050是一款跨界处理器,它拥有应用处理器级别的性能(Cortex-M7内核,最高600MHz)和微控制器的实时性及易用性。在安全层面,它为我们的PUF方案提供了坚实的舞台:
- 高性能与大内存 :PUF相关的密码学运算(如ECC)是计算密集型操作。RT1050的高主频和紧耦合内存(ITCM/DTCM)能显著加速这些操作,提升用户体验。官方数据显示,在600MHz下完成一次ECDSA P256签名/验证仅需不到7毫秒。
-
丰富的安全外设
:
- 硬件加密加速器(CAAM) :虽然PUF密钥本身不直接交给CAAM,但CAAM可以用于加速后续大量的数据加解密操作(例如用PUF封装的AES密钥去加密通信数据),实现安全与性能的兼顾。
- 安全启动(HAB) :RT1050支持基于数字签名的安全启动,确保第一段执行的代码未被篡改。我们可以将BroadKey库的完整性验证纳入安全启动链,形成纵深防御。
- 加密启动与XiP :支持对存放在外部QSPI Flash中的代码进行实时解密执行(Encrypted XIP)。这可以用于保护包含BroadKey辅助数据甚至核心逻辑的固件,防止静态分析。
- 资源域控制器(RDC)与外围防火墙 :可以创建隔离的硬件资源域,将运行BroadKey的代码、数据与其它非安全任务隔离开,即使系统其他部分被攻破,也能保护PUF核心操作的安全。
- 成本与生态 :相比集成专用PUF硬件的芯片,RT1050+软件PUF的方案在成本上更具弹性,且能利用成熟的MCUXpresso IDE、SDK以及广阔的Arm Cortex-M生态,降低开发门槛。
3.2 开发环境搭建与Demo工程剖析
拿到Intrinsic ID提供的针对i.MX RT1050的BroadKey库之后,第一步就是搭建环境并跑通Demo。这里有几个实操要点:
1. 工程导入与配置:
通常,库文件会以
lib
文件形式提供,并附带一个示例工程。在MCUXpresso IDE中,你需要:
- 将库文件路径添加到项目的链接器设置中。
-
确保链接脚本(
.ld文件)为BroadKey的运行分配了合适的内存区域。 特别注意 :Demo工程为了简化,通常将代码和数据全部加载到内部SRAM中运行。但在实际产品中,代码可能位于XIP Flash。这时,BroadKey初始化阶段(涉及SRAM读取)的代码必须放在内部RAM中执行,因为此时外部Flash控制器可能还未初始化或配置。 - 正确配置堆栈大小。PUF的密钥重建等操作可能需要不小的栈空间,需要根据库文档建议进行调整,否则会导致难以排查的硬件错误(HardFault)。
2. Demo运行与输出解读: 连接RT1050 EVK板,运行Demo,你会在串口终端看到类似以下的流程输出:
BroadKey Demo Start.
Initializing PUF...
Enrollment Phase: Generating Helper Data...
Enrollment Successful. Helper Data saved.
Starting PUF...
PUF Started Successfully.
Generating ECC P256 Key Pair...
Key Pair Generated.
Wrapping Application AES-256 Key...
Key Wrapped. Ciphertext saved.
Unwrapping Key...
Key Unwrapped Successfully.
Signature Generation and Verification Test...
All Tests Passed.
这个流程清晰地展示了密钥的生命周期:
- 初始化与注册 :首次运行时,执行“注册”流程,读取SRAM生成原始特征,并计算出“辅助数据”(Helper Data)。这个数据 必须安全存储 到非易失性存储器(如外部Flash的特定安全区域)。Demo中可能简单写入Flash,实际产品中应考虑结合RT1050的加密XIP功能进行存储。
- 启动与重建 :之后每次启动,加载辅助数据,结合当前SRAM上电值,重建出PUF密钥。
- 使用 :用重建的PUF密钥进行各种操作,如生成新的密钥对、封装应用密钥等。
- 销毁 :要废弃设备密钥,只需 擦除存储的辅助数据 。没有辅助数据,即使拥有物理芯片,也无法再重建出相同的密钥,实现了安全的退役。
3. 关键配置陷阱:
- SRAM区块选择 :不是所有SRAM都适合做PUF。需要选择一块在芯片上电复位后、任何代码(包括BootROM)执行 之前 ,保持其自然上电状态的SRAM区域。RT1050的芯片手册和BroadKey文档会指明推荐的SRAM地址范围(例如,某一段OCRAM)。错误的选择会导致熵源不稳定,密钥重建失败。
-
时钟稳定性
:在读取SRAM上电值的敏感阶段,系统时钟必须稳定。确保在调用
BK_Start()之前,芯片的主时钟、SRAM时钟都已正确初始化并稳定运行。 - 中断与内存访问 :在PUF密钥生成或重建过程中,应避免其他高优先级中断或DMA操作访问PUF所用的SRAM区域,防止干扰。可以考虑在关键操作前暂时关闭全局中断。
3.3 将PUF集成到真实应用场景
跑通Demo只是第一步,真正的挑战在于将PUF无缝、安全地集成到你的物联网设备固件架构中。
场景一:安全设备身份与TLS连接 物联网设备连接云端(如AWS IoT, Azure IoT Hub)通常需要基于X.509证书的双向认证。传统方式是将设备证书和私钥预置在Flash中。
-
PUF增强方案
:
- 设备首次上电,通过PUF衍生出一个唯一的设备标识符(或直接作为ECC私钥种子)。
- 使用此私钥,生成一个证书签名请求(CSR)。
- 在安全的生产环节或首次入网时,将CSR发送给云端或本地CA签发,获得设备唯一证书。
- 将签发的证书存储在Flash中,而对应的私钥 永不存储 ,每次TLS握手时由PUF实时重建。
- 在TLS库(如mbedTLS)中,实现一个自定义的私钥回调函数,该函数内部调用BroadKey的签名接口。这样,私钥全程不出现在内存的明文区域。
场景二:固件空中升级(OTA)的完整性保护 确保下载的固件镜像来自可信源且未被篡改。
-
PUF增强方案
:
- 开发服务器使用一个受保护的根密钥对固件镜像进行签名。
- 设备端预置或从证书中获取服务器的公钥。
- 设备端用于验证签名的公钥,可以使用PUF封装后存储。或者,更直接地,设备端用于解密固件(如果加密OTA)的对称密钥,由PUF密钥封装后存储。
- 收到新固件后,设备先用PUF重建密钥,解封装出验证公钥或解密密钥,然后执行验证或解密。这样,保护OTA安全的核心密钥,其安全性等同于PUF本身。
场景三:保护存储在Flash中的敏感数据 设备需要保存一些敏感信息,如用户密码哈希、传感器校准参数等。
-
PUF增强方案
:
-
设备启动后,重建PUF密钥
K_puf。 -
使用
K_puf(或由其衍生的一个专用密钥K_wrap),通过BroadKey的Wrap函数,对一个用于数据加密的AES-256应用密钥K_app进行加密,得到Wrapped_Key。 -
将
Wrapped_Key存储在Flash中。擦除内存中的K_app和K_puf。 -
当需要读写敏感数据时,再次重建
K_puf,解封装Wrapped_Key得到K_app,然后用K_app解密数据区进行操作。操作完成后,立即擦除内存中的K_app和K_puf。 -
这样,Flash中存储的始终是密文(数据)和被加密的密钥(
Wrapped_Key)。即使Flash被物理拆下读取,也无法获得任何有效信息。
-
设备启动后,重建PUF密钥
4. 方案评估、常见问题与进阶思考
4.1 优势与局限性分析
优势:
- 高安全等级 :密钥不存储,从根本上抵御了针对非易失性存储器的物理攻击。侧信道攻击的窗口也仅限于密钥重建后的短暂使用期。
- 供应链简化 :无需在工厂进行密钥注入。所有芯片出厂时在PUF层面是“空白”的,密钥在设备首次启动时在终端现场生成,降低了生产环节的泄密风险和物流成本。
- 高性价比 :利用现有芯片的SRAM实现,无需额外的安全芯片硬件成本,适合对成本敏感的物联网海量设备。
- 唯一性与防克隆 :每个芯片的PUF响应都是独一无二的,天然防克隆,为设备提供了强唯一性标识。
局限性及应对:
- 环境敏感性 :SRAM的上电状态可能受温度、电压、老化等环境因素影响,导致个别比特翻转(噪声)。这就是为什么需要“模糊提取器”和“辅助数据”来进行纠错。 应对 :选择对环境影响不敏感的SRAM区域;确保供电稳定;BroadKey库内部已有成熟的纠错算法,只要噪声在容限内即可稳定重建。
-
SRAM占用
:需要预留一块SRAM专供PUF使用,在运行期间不能被其他程序覆盖。
应对
:在链接脚本中预留固定区域(如
OCRAM的一部分),并确保系统内存分配不会使用该区域。 - 启动时间开销 :PUF密钥重建过程包含SRAM读取和纠错计算,会带来几十到几百毫秒的启动延迟。 应对 :对于实时性要求极高的应用,需评估��开销是否可接受。可以考虑异步初始化或在后台线程进行重建。
- 依赖软件实现 :作为软件库,其运行环境(RTOS、中断、内存)的安全性需要自行保障。 应对 :充分利用RT1050的TrustZone-M(如果可用)或RDC/防火墙功能,将BroadKey运行在隔离的安全环境中。
4.2 实战问题排查清单
在调试过程中,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
BK_Start()
失败,返回错误码
|
1. 指定的SRAM区域不正确或不可用。
2. 系统时钟未稳定或配置错误。 3. 堆栈空间不足。 4. 辅助数据损坏或格式不对。 |
1. 核对芯片手册和库文档,确认SRAM地址和大小。用简单读写测试验证该区域可正常访问。
2. 检查系统初始化代码,确保在调用
BK_Start()
前,主时钟和SRAM时钟已初始化完毕并稳定运行一段时间。
3. 增大启动任务的堆栈大小,或检查是否发生栈溢出。 4. 如果是重建阶段失败,检查存储辅助数据的Flash区域是否被意外擦写。确认读写辅助数据的函数(需用户实现)正确无误。 |
| 密钥重建不稳定(时而成功时而失败) |
1. 环境噪声干扰(电压纹波、温度剧烈变化)。
2. 在PUF操作期间被中断或DMA打断。 3. SRAM区域在启动后被其他代码污染。 |
1. 确保电源设计良好,在芯片供电引脚有足够的去耦电容。在极端温度下测试,评估环境适应性。
2. 在
BK_Start()
和关键密钥操作期间,临时关闭全局中断,并暂停可能访问该SRAM区域的DMA通道。
3. 检查链接脚本,确保PUF SRAM区域(
noinit
段)在启动后不会被任何初始化代码(如
.data
段复制、
.bss
段清零)覆盖。
|
| 封装/解封装操作失败 |
1. 用于封装/解封装的密钥句柄无效。
2. 提供的输入输出缓冲区地址或长度参数错误。 3. 内存对齐问题(某些平台要求4字节或8字节对齐)。 |
1. 确认密钥句柄是通过
BK_GenerateKey
或
BK_CreateKey
成功创建的。
2. 仔细核对API文档,确保传入的密文缓冲区、明文缓冲区大小符合要求。 3. 确保传入的缓冲区指针是内存对齐的。可以使用
malloc
或静态数组并指定对齐属性。
|
| 性能不达预期 |
1. 代码未在紧耦合内存(TCM)中运行。
2. 编译器优化等级过低。 3. 频繁的密钥重建操作。 |
1. 将BroadKey库的关键函数(通过链接脚本或属性
__attribute__((section(".fast_code")))
)放到ITCM中执行,数据放到DTCM中。
2. 将编译优化等级提高到
-O2
或
-Os
。
3. 评估业务逻辑,避免不必要的密钥重建。例如,在一次上电周期内,重建一次PUF密钥后,可将其缓存在安全内存中用于多次操作,而非每次都用。 |
4.3 进阶:与芯片安全特性的联动
要让整个系统的安全性最大化,不应将PUF视为一个孤立的模块,而应将其与i.MX RT1050的其他安全特性深度集成:
- 与安全启动(HAB)联动 :在HAB的启动信任链中,可以将BroadKey库的哈希值或签名加入证书链进行验证。确保设备运行的PUF代码是经过认证的、未被篡改的版本。
- 与加密XIP联动 :将存储了辅助数据、甚至整个BroadKey库的Flash区域进行加密。只有正确启动、通过安全认证的芯片,才能解密并执行这些代码和数据,防止固件被提取分析。
- 与TrustZone-M或RDC联动 :如果应用复杂,可以考虑将包含BroadKey操作的安全任务运行在TrustZone的安全世界(Secure World),或者使用RDC将其隔离到一个独立的资源域中。非安全世界的任务无法访问该域的内存和外设,即使非安全世界被攻破,PUF密钥依然安全。
- 与硬件加密加速器(CAAM)联动 :虽然PUF密钥本身不直接交给CAAM,但由PUF密钥保护的应用密钥(如AES密钥)可以导入CAAM的密钥槽,后续大量的数据加解密工作就由CAAM硬件加速完成,实现安全与效率的完美结合。
在我实际将这套方案推向几个物联网终端产品的过程中,最大的体会是: 安全是一个系统工程 。SRAM PUF提供了优秀的根密钥保护方案,但它不是银弹。你需要结合安全启动、访问控制、安全通信(TLS)、安全的OTA更新等一系列措施,才能构建起一个纵深防御的体系。从RT1050 EVK上的原型验证,到最终产品量产,中间还需要经过大量的环境可靠性测试、功耗测试和渗透测试。例如,我们曾在高低温循环箱里连续跑了一周,确保密钥重建成功率在99.99%以上;也请安全团队尝试了各种故障注入攻击,验证其鲁棒性。
最后,关于密钥生命周期管理,还有一个容易被忽略的点: 辅助数据本身的备份与恢复 。虽然它不是秘密,但一旦丢失,设备将无法重建密钥,导致“变砖”。在产品设计中,需要考虑是否在Flash的不同扇区存储多份拷贝,或者设计一个通过安全通道从服务器恢复辅助数据的机制(这本身又是一个安全挑战)。这没有标准答案,需要根据你的具体应用场景、成本和安全要求来权衡。安全之路,始于对每一个细节的审慎思考与扎实实践。
1万+

被折叠的 条评论
为什么被折叠?



