1. 你的芯片安全吗?
如果大家看过速度与激情这部电影,一定对下面这一幕有深刻的印象:黑客通过远程控制上千辆的僵尸车辆,去自动拦截抢夺握有核发射密码的人! 然后掌控人类的命运。
现实生活中可能没有电影里这么戏剧化,不过危机却在我们身边时刻不停地在上演。大品牌的电子产品被仿冒造成的损失是不可估量的。同时,将来随着物联网,自动驾驶等技术的普及,其核心芯片的安全问题越来越重要,一旦被破解,遭受攻击,后果难以想象。
然而,芯片的安全性确是大多数工程师往往忽略,或者说不太重视的问题。这里我们对芯片如何被破解进行一个简单的探讨,从而大家可以有针对性地采取一些防护手段。
大家知道一个电子产品,硬件电路被复制是几乎没有什么难度的,即使打磨掉芯片上的字符。所以最关键的是获得芯片内部存储的代码,因为代码是整个系统运行的灵魂。
现在大多数芯片都有加密位,在设置加密位后,通过编程工具是没有办法读出代码的。但我们不要低估了坏人的邪恶,他们会想尽种种办法来进行攻击。从总体上来说可以归结为两种方法:侵入式攻击和非侵入式攻击。如果用保险箱来比喻,盗取钥匙打开保险箱可以说是非侵入式攻击,拿电锯锯开保险箱就属于侵入式攻击了。
2. 常用的攻击手段
2.1 部分擦除
加密后的芯片一般允许整体擦除(Mass Erase)。如果在整体擦除芯片时,控制擦除的时间,在刚刚好擦除掉加密位的时候停止(比如掉电),那么芯片就被解密了。
2.2 电压毛刺(Power Glitch)攻击
是在芯片电源引脚故意输入毛刺,使得芯片运行受到影响,使其运行跳过某些指令或发生错误的操作,从而使芯片信息泄露。
2.3 欠压,过压,时钟瞬态跳变
利用欠压,过压,时钟的瞬态跳变,使芯片产生异常,影响芯片的正常执行,使保护电路失效。
2.4 时序攻击(Timing Attack)
代码在处理不同的数据,或走不同的流程时,时间上是不同的。时序攻击利用这一特点可以反推密钥。
2.5 功率分析(SPA: Simple Power Analysis)
芯片在运行不同的指令的时候,消耗的功率是不一样的。功率分析正是利用种特性,在代码运行密码相关运算时,用高分辨率功率测量仪器从外部测量芯片功率的变化,从而提取加密密钥。
2.6 差分功率分析 DPA(Differential Power Analysis)
在SPA的基础上,收集已有的密码运算时的功率变化数据,在多次统计的基础上进行分析。是比SPA更有效的攻击。
2.7 硬解密
这是最暴力,最不好防范的攻击方法。它用溶剂溶解芯片外面的壳体,把芯片暴露出来,然后用高倍显微镜和聚焦离子束 FIB(Focused Ion Beam)找到加密位置,把它改变为非加密状态,然后读出芯片内容,然后进行解密,反汇编。
看了这些攻击手段,是不是开始出冷汗了呢?别担心,这只是一部分大家都熟悉的方法,哈哈。不过随着进攻之矛越来越锋利,防御之盾也越来越坚固。在讲防御办法前,我们先对相关的加密算法做一个简单的介绍吧。
3. 流行的加密算法
3.1 哈希算法(Hash)
它的作用是把任意长度的明文,通过单向加密函数,生成固定长度的信息摘要。如果明文发生变化,那么会引起信息摘要的变化。从信息摘要无法反推出明文。
常用算法: MD5,SHA-1。
3.2 对称加密算法(Symmetric Encryption)
用相同的密钥进行加密和解密。如同一个保险柜,一个人用一把钥匙把文件锁进去,另一个人需要用相同的钥匙打开保险柜,才能看到文件里写的什么。这种算法的关键是密钥的保存,分发,防止非授权的人获得密钥。
常用算法: DES, AES,RCx
3.3 非对称加密算法(Asymmetric Encryption)
所谓非对称指的是加密方和解密方使用的密钥不同。如同一个保险柜有两个门,一个是入口,一个是出口,用入口的钥匙只可以把明文放进去,用出口的钥匙可以把明文取出。这种算法带来的好处是可以把入口的钥匙公开出来(公钥),大家都可以用公钥进行加密,但是除了掌管私钥的人,其他人是没有办法看到保险柜中的内容的。
常用算法: RSA,ECC
4. 加密算法的特点和安全性
Hash 主要用于数字签名。据说最早的应用之一是美苏互相把地震仪放到对方,监控对方有没有进行核试验。双方对对方都不放心啊,所以用这种算法把数据做数字签名,大家都能看到数据,而且不能篡改。
对称加密算法运算速度快,一般用来对大量数据加解密。
公钥算法运算速度比较慢,消耗资源多。它常常在开始阶段用来分发对称算法使用的密钥,之后通讯切换到对称加解密算法。
理论上所有加密算法都是可以被破解的,只是花费的时间和代价的问题。
只有一种加密方法是完全无法破解的,那就是一次一密。加密者和解密者使用相同的密码本,密钥是真随机数,而且长度和明文相等,每一个明文字母用一个密钥字母加密成密文,密码本使用一次后既废弃。据说很多间谍就是用的这种加密方法。
5. 如何保护芯片
假如我们写了一份机密文件,怎样才能不被别人得到呢?首先想到的还是保险柜,我们可以把文件锁进保险柜里,当然保险柜有不同级别,有的还有监控功能,比如发现有人敲击,挪动,高温(切割)等就发出报警,或者把文件销毁。当然越高级的保险柜价格越高。再有就是我们把写的内容加密,即使间谍拿到了也看不懂。最后为了更保险,我们还可以把文件分为两份,分别锁进两个保险柜里。
对于代码来说,也是类似的。把代码放入芯片后设置加密位,使别人无法读出;或者用芯片的唯一序列号用算法加密后存入特定地址,运行前做比对;或者把代码(或代码的一部分)加密后存入外部存储器,只发送给握有密钥的主芯片;这就会用到前面我们介绍的几种算法之一,或几种的组合。我们可以根据产品的价值来使用不同等级的保护方法。下面是一些从硬件到软件需要考虑的地方:
a. 设置加密位。如果芯片支持则设置禁止整体擦除。
b. 下载代码后把调试口禁止掉。
c. 地址线和数据线打乱。用PAL,GAL,CPLD做映射。
d. 尽量不用代码里的默认值,代码空间不留空白区域。
如果猜测出一部分明文,将会导致破解变得容易。
e. 在处理密码或数据时用混入随机数,插入指令等方法,使功耗变化尽量小,不同分支运行时间差别尽量小。防止时序和功率分析攻击。
f. 加密尽量用长的密钥。
g. 在选用 MCU 时,要考虑它是否有足够强的防破解能力。
如 STM32L562的以下特性可以用来提高系统的防御能力:
h. 如果使用的芯片没有很强的防护能力时,可以考虑添加一颗外部芯片来提高防御能力。比如:DS28E01(SHA-1),DS28E38(ECC-P256),LKT4201N(DES/3DES/AES/SHA1/SHA256/RSA/ECC)等。
i. 把一部分核心代码加密后放到外部有加密功能的芯片,加载入MCU后再解密运行。
好了,希望这些对大家有些帮助,以后有机会进行更进一步的探讨。
参考资料:
1.Applied Cryptograhpy, Bruce Schneier
2.STM32L562 Datasheet