3. PUF分类:基于硅的PUF与非硅基PUF
聊PUF分类之前,我先说说自己的体会。刚接触PUF那会儿,我总觉得这东西很玄——一个芯片能产生独一无二的“指纹”?后来拆开看,其实原理没那么神秘。PUF的核心就是利用物理制造过程中不可避免的随机偏差。你想想看,同一片晶圆上切下来的两个芯片,哪怕设计一模一样,实际参数也会有细微差别。
根据实现载体不同,PUF大致分两类:基于硅的PUF和非硅基PUF。前者直接用CMOS工艺做,后者则依赖光学、涂层等物理介质。我个人习惯把硅基PUF叫“正统派”,因为它在芯片里集成最方便;非硅基PUF则是“特种兵”,特定场景下效果惊人。
核心观点:所有PUF都在干同一件事——把制造偏差映射成可重复的二进制响应。区别只在于“偏差”来自哪里,以及怎么“读”出来。
3.1 基于硅的PUF
硅基PUF是目前应用最广的类型。原因很简单——它可以直接用标准CMOS工艺制造,不需要额外材料或特殊工序。我参与过的几个安全芯片项目,基本都选了硅基PUF,因为流片时不用改工艺,省心。
3.1.1 仲裁器PUF (Arbiter PUF)
仲裁器PUF的原理,说白了就是比谁跑得快。芯片内部设计两条完全对称的路径,输入一个上升沿信号,让它同时从两条路径走。由于制造偏差,两条路径的延时不可能完全相等。最后用一个仲裁器(比如D触发器)判断哪个信号先到,输出0或1。
我的经验:仲裁器PUF的响应位宽可以做得很大,一条路径对就能产生1 bit。但问题是它对环境温度和电压非常敏感。我曾经在-40°C和85°C下测同一个PUF,有将近15%的位发生了翻转。所以实际使用时必须配合纠错码(ECC),否则没法用。
仲裁器PUF的典型结构如下:
// 仲裁器PUF核心逻辑(伪代码)
input: challenge[N] // N位挑战信号,控制路径选择
output: response[1] // 1位响应
// 路径选择:每个stage根据challenge[i]选择交叉或直通
stage_1 = mux(challenge[0], path_a, path_b)
stage_2 = mux(challenge[1], stage_1_out_a, stage_1_out_b)
...
stage_N = mux(challenge[N-1], stage_{N-1}_out_a, stage_{N-1}_out_b)
// 仲裁:判断哪条路径信号先到达
response = arbiter(stage_N_out_a, stage_N_out_b)
这里有个关键点:挑战值(challenge)可以改变路径的拓扑结构。同一个PUF,输入不同的challenge,会得到不同的response。所以仲裁器PUF天然支持“挑战-响应对”(CRP)认证,非常适合做双向认证。
注意:仲裁器PUF存在建模攻击风险。攻击者如果收集到足够多的CRP,可以用机器学习模型(比如逻辑回归、SVM)把PUF的行为学出来。我见过一个案例,攻击者只用了5000组CRP就成功预测了90%以上的响应。所以仲裁器PUF不适合暴露大量CRP的场景。
3.1.2 环形振荡器PUF (Ring Oscillator PUF)
环形振荡器PUF的思路更直观:在芯片上放多个环形振荡器(奇数个反相器首尾相连),每个振荡器因为制造偏差,振荡频率会略有不同。比较两个振荡器的频率,谁高谁低,就产生1 bit响应。
我记得第一次在FPGA上搭环形振荡器PUF时,遇到一个坑:布局布线如果不做约束,频率差异可能被走线长度差异淹没,而不是真正的工艺偏差。后来我学乖了,必须用硬宏(hard macro)或者手动约束保证对称性。
环形振荡器PUF和仲裁器PUF的对比:
| 特性 | 仲裁器PUF | 环形振荡器PUF |
|---|---|---|
| 响应生成方式 | 比较两条路径延时 | 比较两个振荡器频率 |
| 挑战-响应空间 | 大(2^N种挑战) | 小(取决于振荡器对数) |
| 对温度敏感度 | 高 | 中(差分比较可抵消共模变化) |
| 抗建模攻击能力 | 弱 | 较强 |
| 面积开销 | 小 | 中(每个振荡器需要多个反相器) |
我个人在实际项目中更倾向环形振荡器PUF,原因有两点:一是它对建模攻击的抵抗性更好,因为频率比较是非线性的,机器学习模型很难拟合;二是差分比较能抵消一部分环境变化的影响。当然,代价是面积更大,响应位数也受限。
3.1.3 SRAM PUF
SRAM PUF可能是最“省事”的PUF了。它利用SRAM单元上电时的随机状态——每个6T SRAM单元在供电瞬间,由于两个交叉耦合反相器的失配,会随机稳定到0或1。这个初始状态就是PUF的响应。
你想想看,几乎任何芯片里都有SRAM,所以SRAM PUF几乎不需要额外硬件。我参与的一个IoT安全方案,直接用了芯片自带的128KB SRAM,取上电后前64个字节作为设备指纹,零成本实现PUF。
关键指标:SRAM PUF的可靠性取决于单元的“偏好强度”。有些单元上电后99%的概率是0,这叫“强偏好”单元,适合做稳定响应位。有些单元50%对50%,这叫“不稳定单元”,必须剔除。一般SRAM PUF的稳定位比例在60%-80%之间,剩下的需要用ECC或模糊提取器处理。
SRAM PUF的典型应用流程:
- 注册阶段:给芯片上电,读取SRAM初始状态,生成辅助数据(helper data)用于纠错。
- 重构阶段:再次上电,读取SRAM状态,结合辅助数据恢复出原始密钥。
- 注意:辅助数据可以公开存储,但不能泄露密钥信息。这是通过模糊提取器(fuzzy extractor)保证的。
避坑指南:我曾经在一个项目里直接用SRAM上电状态当密钥,没做任何纠错处理。结果产品在高温环境下批量失败——因为温度变了,SRAM的初始状态也跟着变。从那以后,我每次设计SRAM PUF都会预留至少25%的冗余位用于纠错。
3.2 非硅基PUF
非硅基PUF不依赖CMOS工艺,而是利用其他物理介质的随机特性。这类PUF在防伪标签、证件防伪、封装完整性检测等领域有独特优势。
3.2.1 光学PUF (Optical PUF)
光学PUF的原理很巧妙:用透明材料(比如环氧树脂)掺杂随机分布的散射粒子,当激光照射时,会产生独特的干涉或散射图案。这个图案用相机拍下来,就是PUF的响应。
光学PUF的优点是响应空间极大——一个微小的散射图案就能包含海量信息。而且它几乎不可能被克隆,因为要精确复制每个粒子的三维位置,目前的技术做不到。
但光学PUF的缺点也很明显:需要外部光源和图像传感器,没法直接集成到芯片里。所以它更适合做高价值商品的防伪标签,比如奢侈品、药品、证件等。
我见过的应用:某高端酒类品牌在瓶盖封口处嵌入光学PUF标签,每瓶酒都有独一无二的散射图案。消费者用手机APP扫描就能验证真伪。这个方案的好处是攻击者无法批量复制,因为每个标签的粒子分布都是随机的。
3.2.2 涂层PUF (Coating PUF)
涂层PUF是在芯片表面涂一层掺杂了随机介电颗粒的材料,然后测量涂层上不同位置的电容或电阻值。由于颗粒分布随机,每个位置的电气特性都不一样,这就构成了PUF的响应。
涂层PUF最大的优势是防物理攻击。如果有人试图用探针或FIB(聚焦离子束)分析芯片内部,必须破坏涂层,而涂层一旦破坏,PUF响应就变了,芯片可以检测到并触发自毁机制。
三种非硅基PUF的对比:
| 特性 | 光学PUF | 涂层PUF |
|---|---|---|
| 物理介质 | 透明散射材料 | 掺杂介电颗粒的涂层 |
| 读取方式 | 激光+相机 | 电容/电阻测量电路 |
| 片上集成难度 | 高(需要光学组件) | 中(需要测量电路) |
| 防物理攻击能力 | 弱(涂层可被移除) | 强(破坏即失效) |
| 典型应用 | 防伪标签、证件 | 安全芯片封装保护 |
3.3 如何选择PUF类型?
说了这么多,到底该用哪种PUF?我个人的选择逻辑是这样的:
- 需要片上集成、面积敏感:选SRAM PUF,零额外成本,但要做好纠错。
- 需要大量CRP、做双向认证:选仲裁器PUF,但要加抗建模攻击的防护(比如混淆、非线性变换)。
- 需要高可靠性、抗环境变化:选环形振荡器PUF,面积换稳定。
- 做防伪标签、不要求片上集成:选光学PUF,安全性最高。
- 需要防物理拆解攻击:选涂层PUF,破坏即失效。
一句话总结:没有完美的PUF,只有最适合场景的PUF。设计时一定要想清楚你的威胁模型——攻击者是谁?攻击手段是什么?成本预算多少?想清楚这些,PUF类型自然就定了。