4、FPGA防篡改设计:防侧信道攻击技术、防故障注入攻击技术、防逆向工程技术
各位工程师朋友,咱们今天聊点硬核的。FPGA设计里,功能实现只是及格线,真正拉开差距的,是你能不能把这块芯片守住了。
我这些年做安全芯片,见过太多设计被攻破的案例。说白了,攻击者根本不需要知道你的算法有多精妙,他只需要盯着你的功耗、电磁辐射,或者往你的芯片上照一束激光,你的密钥就自己“吐”出来了。
嗯,这就是我们要讲的三大防篡改技术:防侧信道、防故障注入、防逆向工程。这三板斧,缺一不可。
核心观点:FPGA安全不是加一把锁,而是构建一个多层防御体系。攻击者只要突破一层,你的设计就裸奔了。
4.1 防侧信道攻击技术
先说说侧信道攻击。这玩意儿听起来玄乎,其实原理很简单——你的芯片在工作时,功耗、电磁辐射、甚至运算时间,都会泄露信息。
我印象很深,有一次帮客户做AES加密核的评估。他们觉得算法本身没问题,密钥肯定安全。结果我用示波器抓了一下午的功耗曲线,做了个简单的差分功耗分析(DPA),密钥就出来了。客户当时脸都绿了。
为什么会这样?因为CMOS电路有个天然特性:数据翻转时功耗不一样。0变1和1变0,消耗的能量有差异。攻击者就是利用这个微小的差异,通过统计手段把密钥还原出来。
那怎么防?我个人习惯用三种方法:
- 功耗均衡:让每次运算的功耗尽量一致。比如用双轨逻辑,每个信号都配一个互补信号,保证每次翻转的功耗恒定。代价是面积翻倍,功耗也翻倍。
- 噪声注入:在电路中加入随机噪声发生器,把真实的功耗信号淹没掉。攻击者需要采集更多样本才能提取出有效信息。
- 掩码技术:把敏感数据拆分成多个随机分片,每个分片单独运算。攻击者即使抓到功耗,看到的也是随机数,不是真实数据。
实战技巧:我建议在设计中同时使用功耗均衡和掩码技术。单一方法容易被攻破,组合使用才能形成有效防护。我在一个支付终端项目里就是这么做的,通过了PCI PTS 5.0认证。
这里给一段简单的Verilog代码,展示功耗均衡的基本思路:
// 双轨逻辑示例
module dual_rail_and (
input wire a, a_n, // a_n 是 a 的互补信号
input wire b, b_n,
output wire q, q_n
);
// 传统与门
assign q = a & b;
// 互补与门(保证功耗恒定)
assign q_n = a_n | b_n;
endmodule
你看,每次运算时,q和q_n总有一个在翻转,另一个保持不变。这样功耗曲线就平滑多了。
4.2 防故障注入攻击技术
故障注入攻击,说白了就是故意让芯片出错。攻击者用激光、电磁脉冲、或者电压毛刺,让某个寄存器翻转,或者让某个运算结果出错。
我曾经遇到过一起案例:攻击者用激光照射芯片的特定位置,让AES最后一轮的轮密钥加法跳过了。结果呢?密文直接暴露了密钥信息。这种攻击成本不高,但破坏力极强。
防故障注入,我总结了三道防线:
- 冗余校验:关键运算做两遍甚至三遍,结果不一致就报警。比如用三个相同的AES核并行运算,取多数表决结果。
- 时序监测:在芯片内部放一个环形振荡器,监测时钟的稳定性。一旦检测到时钟毛刺或电压波动,立即复位或擦除密钥。
- 光敏检测:在芯片顶层放置光敏二极管阵列。激光照射时,光敏器件产生电流,触发安全响应。
注意:冗余校验不是万能的。如果攻击者同时注入多个故障,绕过所有冗余路径,那冗余就失效了。我建议冗余路径之间要有物理隔离,比如不同的电源域、不同的时钟域。
这里有个实际项目的经验:我在设计一款金融安全芯片时,用了三重冗余的AES引擎。但第一次流片回来,发现三个引擎的布局太近了。攻击者用一束宽激光就能同时影响三个引擎。后来我重新布局,把三个引擎分散到芯片的不同角落,中间加了屏蔽墙。这才算真正防住了。
4.3 防逆向工程技术
逆向工程,就是攻击者想方设法把你的比特流读出来,或者把你的网表还原出来。FPGA的配置比特流一旦被破解,你的IP就彻底暴露了。
说实话,防逆向工程是最难的。因为FPGA本身是SRAM工艺,掉电后配置数据就没了。但攻击者可以在上电瞬间,用探针或者电磁探头把配置流抓下来。
我常用的防护手段:
| 技术 | 原理 | 强度 | 代价 |
|---|---|---|---|
| 比特流加密 | 用AES-256加密配置比特流 | 高 | 需要专用密钥存储 |
| 逻辑混淆 | 在网表中插入冗余逻辑,隐藏真实功能 | 中 | 面积增加20-50% |
| 熔丝/反熔丝 | 一次性编程,不可读回 | 极高 | 仅限特定FPGA |
我个人最推荐的是比特流加密 + 逻辑混淆的组合。比特流加密防住外部读取,逻辑混淆防住内部破解。即使攻击者拿到了加密后的比特流,没有密钥也解不开。即使解开了,看到的是混淆后的网表,也分析不出真实功能。
避坑指南:我曾经见过一个设计,用了Xilinx的比特流加密,但密钥存储在电池供电的SRAM里。结果攻击者用低温冷冻法,把SRAM里的密钥读出来了。记住:密钥存储一定要用物理不可克隆函数(PUF)或者一次性熔丝,不要用易失性存储。
逻辑混淆怎么做?举个简单的例子:
// 原始逻辑
assign y = a & b;
// 混淆后的逻辑(插入冗余输入k)
assign y = (a & b) ^ (k & ~k); // k & ~k 恒为0,不影响功能
你看,我插了一个冗余输入k,但k & ~k永远为0,所以功能不变。攻击者看到这个网表,会以为y依赖于k,但实际上k是假的。这种混淆点多了,逆向分析的难度就指数级上升。
嗯,说到这儿,三大防篡改技术基本讲完了。总结一下:防侧信道是防“偷看”,防故障注入是防“破坏”,防逆向工程是防“抄作业”。三者缺一不可,而且必须从设计初期就开始规划。等到流片回来再想加防护,那就晚了。