正文的引导
随着物联网和边缘计算的出现,各种各样的MCU也得到了应用。 如何确保程序的安全性和知识产权不受侵犯? 本文介绍主流MCU的程序加密。 希望有助于选择最适合自己APP应用的微处理器。
1. MCU加密
MCU加密通常是指保护用户的程序固件,防止他人读取通过外部调试接口或其他方式写入Flash的程序。 保护自己的方案不轻易被别人模仿,保护自己的知识产权免受硬件的侵害。 MCU加密还意味着防止恶意读取解密自己的程序。
2. 常用MCU加密方式
通过写特定的配置词;
添加外部加密芯片
加密程序代码,将程序变成密文;
程序检查芯片的唯一ID。
2.1 配置字加密
2.1.1 原理
MCU供应商在设计芯片时向芯片中添加特定的非易失性存储器。 此内存也可能是Flash的特定地址区域。 用户可以从外部工具或程序的特定地址写入启用存储保护的值。
配置字加密只有在芯片通电定时完成后才能生效。 通常包括以下功能:
禁止调试接口(JTAG/SWD );
可以调试接口,但调试器不能连接到内核以访问Flash和RAM空间。
关闭读写Flash的ISP命令;
禁止闪存操作,除非芯片正常运行程序;
禁止芯片从外部接口或RAM启动执行代码。
2.1.2 应用场景
通常在程序存储在芯片中的Flash的系统中时使用此加密方法。 例如,NXP LPC系列MCU、GD32系列MCU、NXP Kineits Cortex-M系列。
2.2 外接加密芯片
2.2.1 原理
加密芯片保护程序的方式是通过程序与外部的加密IC的交换来确认程序是否会被进一步执行的方式。
利用芯片随机数外围设备和其他可以产生随机数的机制,每次通电时,系统获取随机数,并通过诸如IIC之类的协议将该随机数传输给外部的硬件加密IC。 之后,系统按照前面约定的算法进行结果计算,等待外部IC接收随机数并计算结果后,外部IC将计算结果返回系统。 如果系统的计算结果和外部IC的计算结果相同,则存在外部的加密IC。
2.2.2 应用场景
这种加密方式主要用于用户加密代码中的关键算法,算法通常以Lib方式提供,只有购买了相应加密芯片(如产品密钥)的用户才能使用算法程序。
2.3 UID检验加密
2.3.1 原理
UID加密是用户主动加密的方法。 目前,大多数处理器都内置有UID,可以通过直接地址读取或IAP命令获得。
UID加密通常有两种方法。
用户在烧程序时读取一次芯片UID并将其写入Flash的特定区域。 程序启动时直接读取UID和Flash内部的数值进行比较,决定是否启动;
用户读取UID后,将使用私钥加密UID的信息写入Flash的特定地址,例如Flash的最后一个扇区。 程序启动时,首先读取芯片UID,用相同的键和算法计算后,与Flash的数值进行比较,决定是否启动。
其中第一个最容易被解读,第二个也有潜在的风险。 为了增强第二个安全性,可以将加密的数据拆分并存储在Flash的不同位置,以便在运行时进行组合。
2.3.2 应用场景
主要用于LoRa协议栈、文件系统和专用操作系统等不太需要保护的协议栈。 协议栈的价值相对较低,添加加密芯片的成本太高。
此外,还可以将该方法扩展为使用PID (每个型号的ID相同)来区分设备型号。
2.4 程序固件加密
2.4.1 原理
程序固件加密是
指通过私有密钥将整个程序固件加密计算后生成密文,使得程序即使被其他人拿到后也不可能被反编译。这种加密方式通常需要有一段地址存储密钥和解密程序,他们可以是芯片内部Bootloader或用户自己的Bootloader。
2.4.2 应用场景
这种加密方式主要用于芯片没有内部Flash或Flash较小,以及需要给用户升级固件的产品上。例如:
芯片从外部Flash启动时,外部Flash很容易被拷贝,盗版。这种应用通常芯片内部具备OTP区域用于编程密钥;
芯片内部Flash较小时可以将算法等文件放置在外部Flash中,运行时解密到内部RAM执行。密钥通常和内部Flash的程序一同存储;
使用在产品需要后期升级功能算法的项目中,可以在Bootloader中放置解密程序,升级的过程中,Bootloader将收到的固件解密烧写到内部Flash中。这样既可以随意发送产品更新固件,同时不用担心知识产权被侵害。
例如i.MX RT1050系列芯片就是使用程序固件加密,程序被放置在外部Flash中,执行时边解密边执行,对i.MX RT1050系列的加密问题可以联系我们。
3. 常用芯片的加密方式
3.1 NXP LPC系列
LPC系列MCU大多采用配置字加密方式,即CRP(Code Read Protection)加密。将配置字(CRP Key)写入特定的Flash地址中。芯片上电启动后内部boot会根据配置选择禁用相应的功能。
CRP是一种允许用户在系统中启用不同级别的安全性的机制,从而可以限制对片上闪存的访问和ISP的使用。当需要时,通过在0x0002FC中闪存位置编程特定模式来调用CRP。IAP命令不受代码读取保护的影响。
以LPC824位例,在启动文件(*.s)中找到CRP Key根据需要进行修改,如图3.1。
图3.1 CRP Key示例
注:切记在产品最终固件中才可使用CRP3,否则芯片将被锁死不能再被解锁。
3.2 NXP Kineits Cortex-M系列
Kineits Cortex-M系列的加密同样使用配置字的方式写入Flash特定区域,但它比LPC系列相对复杂一些功能也更加强大。
Kineits Cortex-M系列的加密包含在FlashConfig区域,FlashConfig包含一些用于芯片内部Boot的配置信息,比如使能或禁能NMI引脚中断。
图3.2 FSL的FlashConfig段
使用keil工具可以快速使用UI配置,如图3.3所示:
图3.3 启动文件配置
3.3 GD32系列
GD32系列加密与和STM32系列加密方式类似。GD32内部包含一个FMC外设。FMC提供了一个安全保护功能来阻止非法读取闪存。此功能可以很好地保护软件和固件免受非法的用户操作。
FMC包含一个OB_RDPT字节与其补字节:
当将OB_RDPT字节和它的补字节被设置为0x5AA5,系统复位以后,闪存将处于非安全保护状态;
当设置OB_RDPT字节和它的补字节值为任何除0x5AA5外的值,系统复位以后,安全保护状态生效;
在安全保护状态下,主存储闪存块仅能被用户代码访问且前4KB的闪存自动处于页擦除/编程保护状态下。在调试模式下,或从SRAM中启动时,以及从boot loader区启动时,这些模式下对主存储块的操作都被禁止;
如果将OB_RDPT字节和它的补字节设置为0x5AA5,安全保护功能将失效,并自动触发一次整片擦除操作。
GD官方提供加密工具GigaDevice_MCU_ISP_Programmer或者使用FlyMCU等工具,操作界面如图3.4所示:
图3.4 GD32使用FlyMCU加密
3.4 i.MX RT系列
i.MX RT系列是NXP公司发布的跨界处理器,MPU的处理性能、MCU的开发方式。该系列不包含用户可用的内部Flash,所有代码都要存储在外部存储介质中。它使用FSL独有的HAB安全机制,能够达到比前面更安全的加密机制。
i.MX RT的加密是将程序固件完全通过工具转换为密文,不能够被反编译,同时i.MX RT内部包含OTP区域,用于编程密钥信息和启动信息,加密后不可读取。
芯片使用QSPI或HypeFlash时,可以实现边运行边解密,不占用额外的RAM空间,同时硬件解密配合内核中32KB ICache和32KB DCache使得程序运行不会受到固件加密的影响;
芯片还支持Boot时完全解密程序到内部RAM或外部SDRAM,这种方式代码的启动速度略微变慢,但是能够支持更多的启动方式:SD卡、MMC、Nand Flash等。
NXP提供加密工具CSF和密钥烧写工具FlashLoader,用于程序固件的加密和烧写。如有任何疑问可联系我们的FAE获得支持。
【来源】
转载于:https://www.cnblogs.com/skullboyer/p/9268028.html