【MCU】用stm32的UID给固件加密(重点在加密) |
您所在的位置:网站首页 › lsusb命令如何查询加密狗完整序列号 › 【MCU】用stm32的UID给固件加密(重点在加密) |
1、聊一聊 演员这首歌大家应该再熟悉不过了,其中印象最为深刻的歌词是:"简单点,说话的方式简单点......",说话真的是一门技术,同时也是门艺术! 今天跟大家带来的知识不算难,现在非常多MCU都有全球唯一标识码这个东西,可能大家都了解过,不过具体怎么用并没有实际设计过!下面重点对其加密方面的应用跟大家理一理。 2、stm32的标识码UID 对于目前大部分MCU都会存在一个唯一标识码供用户使用,同样stm32也是一样,通过查找对应的数据手册便可以得到该唯一标识码的具体信息。 这里以stm32F103为例,其他型号的stm32性能也可能不存在该唯一标识,具体需要根据对应的数据手册进行查阅,如果存在可能基地址稍有不同。如下图所示: 分析一下: 1 ) stm32的标识码放在了唯一设备ID寄存器里面,一共96个bit也就是12个字节且只能读取。 2 ) 通过手册上的说明可以大致了解到该唯一标识码的应用场景。 3)一般的量产产品都会有一个设备的条码,那么这个唯一的标识码便可以作为条码的一部分来供查找。 4 ) 在通信协议中该唯一标识码可以作为一种标识序列号来进行设备的加载和区分。 5 ) 当然最后就是把其作为一个安全密钥,然后与软件加密算法结合起来以降低固件被恶意复制的风险。 2、读取UID 对于该唯一标识ID,bug菌这里谈两点注意的: 1、唯一标识ID只是stm32里面一种ID,其实一款芯片内部还有很多其他ID,比如设备ID和其他内部组件的ID等; 2、UID一共是96位具有唯一性,而截取中间的几位不一定具有唯一性。 3、对于UID的读取非常简单,上面的手册截图也说明了,可以通过字节、半字和字来进行读取,也就是说可以用8位、16位、32位来读取。 参考Demo: 1uint32_t Unique[3] = {0}; 2uint8_t unique[12] = {0}; 3 4 int main(void) 5 { 6 uint8_t i; 7 8 Unique[0] = *(uint32_t*)(0x1FFFF7E8); 9 Unique[1] = *(uint32_t*)(0x1FFFF7E8 + 4); 10 Unique[2] = *(uint32_t*)(0x1FFFF7E8 + 8); 11 12 printf("以uint32_t读:\r\n");//插入换行 13 printf("ID 0-31 :%x\r\n",Unique[0]);//插入换行 14 printf("ID 32-63 :%x\r\n",Unique[1]);//插入换行 15 printf("ID 64-95 :%x\r\n",Unique[2]);//插入换行 16 17 for(i = 0 ;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |