“ 在上篇文章中,我们介绍了在汽车应用中,软硬件加密技术在保护车辆数据和通信方面发挥着关键作用。
JokerEye,公众号:ADAS之眼
ADAS-“加密前行”:软硬件技术在汽车安全中的应用"
今天,我们将以实际的加密芯片案例来讲解加密芯片在消费电子、汽车电子等的应用。”
—
硬件加密是指使用待加密的电子产品之外的硬件电路与待加密的电子产品进行通讯,让产品内部程序通过通讯数据来判断自己是否应该继续执行程序。
软件加密是在程序启动前对license做认证来决定程序是否启动或者在数据交互时先调用信息安全模块对信息进行加密,然后接收方使用相应的解密软件进行解密并还原。
首先我们看一段简单的c demo,如下:
int main (int argc, char** argv)
{
if (argc <= 1) {
printf("sorry input argc nums error\r\n");
return 0xee;
}
printf("log success!!\r\n");
return 0;
}
假定我们这里程序判断入参个数就是我们软件做license认证的手段,我们把exe打包给客户,但客户对程序反编译得到主函数符号如下:
0000000000001149 :
1149: f3 0f 1e fa endbr64
114d: 55 push %rbp
114e: 48 89 e5 mov %rsp,%rbp
1151: 48 83 ec 10 sub $0x10,%rsp
1155: 89 7d fc mov %edi,-0x4(%rbp)
1158: 48 89 75 f0 mov %rsi,-0x10(%rbp)
115c: 83 7d fc 01 cmpl $0x1,-0x4(%rbp)
1160: 7f 13 jg 1175
1162: 48 8d 3d 9b 0e 00 00 lea 0xe9b(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
1169: e8 e2 fe ff ff callq 1050
116e: b8 ee 00 00 00 mov $0xee,%eax
1173: eb 11 jmp 1186
1175: 48 8d 3d a5 0e 00 00 lea 0xea5(%rip),%rdi # 2021 <_IO_stdin_used+0x21>
117c: e8 cf fe ff ff callq 1050
1181: b8 00 00 00 00 mov $0x0,%eax
1186: c9 leaveq
1187: c3 retq
1188: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
118f: 00
从上面汇编代码可以看出:
(1)程序在地址偏移0x115c处和入参个数进行对比(指令cmpl);
(2)若判断成功,把0xee放入eax寄存器(保存程序返回值的寄存器),然后jp跳转到地址偏移0x1186处,完成程序返回 0xee,程序停止;
(3)若判断失败,则继续在地址偏移为0x1175处运行,并打印log sucess;
(4)返回0,程序停止;
此时,黑客从上面汇编代码发现了漏洞,聪明的读者也能看出,假如我把地址偏移为0x1173的指令替换如下:
1173 eb 11 nop #空转
此时软件再重新运行时,即使license判断失败,也不耽误后续软件的正常运行,而这也就是目前一部分软件的破解方式。当然,目前有很多对软件保护的方案如软件套壳、程序逻辑设计、防止反汇编等手段可以防止上述问题。
假设现在软件做了防止反汇编、软件套壳等防护手段,然后现在思考一个软件加密无法解决一个问题:“当出售的软件是可以离线运作时,那么一个license可以在多台电脑上运行,此时我怎么才能解决按照license收费问题呢?”。
答案是:“使用加密芯片,通过硬件加密技术来解决”。
—
回到上一章的问题,假设现在软件已经做过反编译以及软件套壳等加密手段,如何采用硬件加密手段来进行license的一对一唯一验证呢?
在上一篇文章我们提到的数字签名技术。基于数字签名技术,很直接的一个答案已经出来:在软件以及硬件中存放着相同的密钥以及设备的唯一标识数据(可以使用mac地址或者sn)。在软件启动时,软件产生一个随机数然后发送给加密芯片,加密芯片以及软件使用相同的数据以及密钥进行SHA256或者其他算法进行计算。计算结束后,软件对二者结果进行对比,若相同,则程序继续往下执行,否则程序结束退出。
以MCU搭配某国产加密芯片为例,其典型的应用流程如下:
在工厂生产阶段或者程序首次启动阶段,软件可以将密钥(所有软件共享)、UID(唯一标识ID,如芯片的SN)以及自定义数据等写入安全芯片中进行保存。另一方面,这些数据在MCU软件中也可以通过一些方式获取到,注意绿色圈出来的8Bytes常量一般是加密芯片内部固化的。
在软件正式运行阶段,软件每次启动都会生成8Bytes的随机数发送给加密芯片,加密芯片结合密钥、UID、常量数据、以及自定义数据进行SHA256计算,计算后返回MAC2值给MCU。同样MCU也会从自己OTP内部把Key、UID等数据读出,结合随机数进行SHA256计算,生成结果MAC1,通过MAC1和MAC2对比是否相等便可以知道加密芯片是否有更换,决定程序是否启动,完成了MCU以及加密芯片的一对一的认证。假设有人更换了加密芯片,那么加密芯片内部存储的UID和MCU则是不同的,那么二者计算的MAC值也不同,最终的认证结果必然也是失败的。
通过上述流程我们完成了MCU以及加密芯片的一对一绑定,这样我们便可以通过出货加密芯片的的数量来判断软件使用量的多少。另外,加密芯片一般也会有看门狗复位功能,即主控芯片需要定时和加密芯片进行通信数据验证,注意验证是在加密芯片端做的,即主机发送一段数据以及结果给加密芯片,如果数据验证失败或者长时间未进行数据验证,那么加密芯片则会将主机硬件复位,保证了程序的安全。
联想工作中一些比较重要的工业软件,一部分是使用U盾来验证的,其工作原理和上述方案一致,都是通过硬件加密的方式保证一对一的license匹配,只不过内部实现略有不同,在此不再赘述。
—
在国内盗版软件横行的今天,软件破解以及盗版本质上都是对知识产权的不尊重,因此各个厂家在软件防破解方面下足了劲并使用各种方式进行防护。当然今天讲解了硬件加密方案只是众多防护措施的一种,讲述了硬件加密在软件license的认证作用,希望各位看官有所收获。