简单就是说相当于芯片的身份证,可以区分每一个芯片
唯一设备标识符最适合:
● 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
● 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以
提高 Flash 中代码的安全性
● 激活安全自举过程等
96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远
不能改变这些位。
96 位的唯一设备标识符也可以以单字节/ 半字 / 字等不同方式读取,然后使用自定义算法连接
起来。
芯片固件加密破解:
基本上任何固件加密都是可以被破解的,当然使用uid只是会增大破解的难度,如果当我们使破解的难度几乎等同于重新写代码的难度的时候,这个时候就算是加密的成功了。
代码思路:
第一次进入芯片,将芯片身份证固件uid读到静态区flash中
第二次进入芯片,就会将读取芯片uid,如果当前固件被读出到其他芯片中,会判断之前的uid
之前不一样,就会报错
#define UID1_ADDRESS (0x1FFFF7E8)
#define UID2_ADDRESS (UID1_ADDRESS + 4)
#define UID3_ADDRESS (UID1_ADDRESS + 8)
static uint32_t id1 = 0xffffffff;
static uint32_t id2 = 0xffffffff;
static uint32_t id3 = 0xffffffff;
static uint32_t id4 = 0xffffffff;
static uint32_t id5 = 0xffffffff;
static uint32_t id6 = 0xffffffff;
if ((0xffffffff == id1) && (0xffffffff == id2) && (0xffffffff == id3) &&
(0xffffffff == id4) && (0xffffffff == id5) && (0xffffffff == id6))
{
id1 = *(volatile uint32_t*)(UID1_ADDRESS);
id2 = *(volatile uint32_t*)(UID2_ADDRESS);
id3 = *(volatile uint32_t*)(UID3_ADDRESS);
id4 = 0x11111111;
id5 = 0x22222222;
id6 = 0x33333333;
return success;
}
else if((*(volatile uint32_t*)(UID1_ADDRESS) == id1) &&
(*(volatile uint32_t*)(UID2_ADDRESS) == id2) &&
(*(volatile uint32_t*)(UID3_ADDRESS) == id3) &&
(0x11111111 == id4) && (id5 == 0x22222222) && (0x33333333 == id6))
{
return success;
}
else
{
return error;
}