嵌入式系统产品的加密和解密永远是一对矛盾的统一体。这里我们聊聊使用MCU内部UID加密的方案。
首先需要明确的是,没有一种加密是“绝对”可靠的,但是加密手段可以增加非法使用者的解密成本,借此来防止技术被“轻易”盗取。
现在各大厂家 MCU芯片中的绝大部分都内置一串96或128bit唯一标识码【uniqueID】(该值由原厂设定的,不能由用户修改)。
上文提到过UID值由原厂设定的,不能由用户修改,因此该UID对用户来讲是只读的,在一些对数据具有唯一性要求、数据加密操作等场合可以派上用场。MCU芯片中的这个UID 是对整串96位数据保证唯一性,如果你截取其中一部分就不保证唯一性了。
HAL库函数读取UID
#define UID_base ((uint32_t)0x1FFFF7ACU)
芯片UID加密仅仅是一种初级的软件加密方式,另外还有增加外部加密芯片;对程序代码进行密码加密,使程序变成密文等加密方式,欢迎探讨更多的加密方式。
最后顺便提一下,不要把这个UID跟MCU芯片器件ID【DEVICE ID】混为一谈,各大厂家MCU往往还有DEVICE ID,该ID主要包含芯片料号信息和晶圆DIE版本等信息。它可以通过调试接口访问或被用户软件访问。
下图是使用STM32F303 NUCLEO板通过ST-link utility工具读取到的STM32F303 DEVICEID的信息。