从多年的开发经验来讲,不推荐使用什么加密芯片!真的不推荐。理由:
1、成本比较高,外置芯片就算你的芯片是白来的,你总得占用一点PCB面积吧,PCB是按面积收费的哦。
2、过度占用芯片资源,你有接口就得要引脚吧,不会你的芯片是内置到MCU里的吧。最起码你的有读写代码吧,这些代码不占用flash空间吗?要是因此用了更大flash的芯片,这不就是成本吗?
3、增加系统的故障率,你的系统如果工作在工业级的温度范围内,有可能一些小厂的芯片的温度范围不达标,可能因为这颗料造成你的系统无法工作!就算是达标的芯片,它就敢保证百分百不出问题吗?甚至有些小厂的芯片由于设计的不合理,由于程序中断等的影响造成读写时序“偶尔”出问题,关键是偶尔出现问题很难清查,造成的损失更大。
4、最关键的是你认为有了加密芯片就保险了,恰恰就是你的这种侥幸的心理害了你,在市场上没有没有看到过克隆版的加密狗!那都是被“河蟹”的芯片做的。由于芯片工艺的原因内部一般都有flash区域,这个flash区域很容易被识别,可以通过探针接通这个区域把里面的敏感信息读出来。可能你说我把信息加密不就可以了,那干嘛用加密芯片,普通芯片也一样的。
5、就算你的加密芯片不被破解,通常做法是在程序启动时调一下加密程序,然后就开始正常程序了,使用在程序中不停的检测加密点是不方便的,那这样对于risc指令集的芯片,通过修改指令的办法也是很容易被短路的。只要找到测试跳转指令,把它改成跳转指令就可以完成。这个就是不懂汇编的人,也可以轻易的测试出来。因为RISC指令的反汇编质量太高了。
那么有没有好的便宜的办法呢?那我就推荐一个:
现在的大部分芯片都设计有一个工厂内置的唯一ID(我知道的STM32、NXP的PLC),利用这个芯片ID即经济又方便。
办法就是:在程序启动时将芯片的ID读取出来,然后随便找个算法加密一下,例如:ID和一个质数异或,然后保存到变量中,在程序的循环间隙与程序中事先计算好的数字结果比较,如果不对了!那就好不客气的启动反克隆程序。这样攻击者在不逆向分析你的程序的情况下是很难破解你的芯片的。
|