在信息时代下,信息给我们带来了很多便利,但随着技术的发展,信息的安全也受到越来越多的威胁。目前虽然有专门的数据加密芯片或专门的密码算法,但是用UID和随机数对MCU的数据进行保密仍然是一种简单有效的办法。 之前对比STM32F412和STM32F411的区别之一,就是STM32F412拥有32位的硬件随机数发生器。STM32F412内部的RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。STM32F412内部的RNG处理器提供由模拟量发生器产生的32位随机数,两个连续随机数的间隔为40个PLL48CLK时钟信号周期,对于主频高达100MHz的STM32F412来说,产生一个硬件随机数的速度还是较快的。相对于软件编写的伪随机数,硬件随机数发生器让代码简化,使用更方便。 ; H3 v( N! M2 V$ p 另外STM32F412的内部也提供了一个96位的唯一设备ID。这个唯一设备ID可以用作序列号(例如 USB 字符串序列号或其它终端应用程序),在对内部 Flash 进行编程前将唯一设备ID与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性和激活安全自举过程等。 ; U% u- `# e# u1 J, [7 ^ 现以NUCLEO-F412ZG评估板为基础,keil-MDK5.14开发环境,利用官方标准固件库进行测试评估。工程及源代码见附件。 : z# c2 s" R7 m. V6 S w% g 程序流程部分参考官方例程,主函数先进行UID的获取,然后进入等待外部中断,当外部按键按下,程序往下执行进入获取硬件随机数函数。同时附加延时函数,另外利用NUCLEO-F412ZG评估板的两个LED进行显示。 $ e! C7 |" _2 {; w0 T- o 在线调试的情况下,可以看到读取到的唯一设备ID数据,及获取的硬件随机数。本程序包含了UID的获取、随机数的获取、外部中断的利用和GPIO驱动LED等。程序对UID和随机数的获取,并未利用其进行数据加密或作为序列号的使用等。开发者可以根据自身需求将其进行利用。具体情况如下图。 ! o, U6 ?1 ~4 }) i" ^" y" J 对UID的获取: å¨çº¿è°è¯ä¸è·åçUID éè¿memoryè§æµç96ä½UID 对硬件随机数的获取: å¨çº¿è°è¯ä¸è·åç8个32ä½éæºæ° éè¿memoryè§æµå°çéæºæ°æ°æ® 程序工程基于官方标准库但有所删减和修改,相对于官方的CubeHAL库代码有更高的效率和占用更少的存储空间。如有其它功能模块需要利用,请自行添加相应文件或代码。另外提供单独的main.c文件,有需要的可自行建立工程测试。 有图有代码,我就不啰嗦了。请各位大神拍砖,也欢迎大家讨论。对于NUCLEO-F412ZG评估板的初步开机测试,以及一些基础资料的下载,可参考https://www.stmcu.org.cn/module/forum/thread-608114-1-1.html。 相关推荐: . j% _) v" p, A b/ v9 A" r! F: T/ Y( R ]1 k8 _ # i' [1 [2 |- Y8 y; C9 t. i0 Z j. H { 更多评测:+ r3 ^0 a) U! _2 i0 F F412ZG评测之RAM和FLASH速率 |
嘿嘿。。。。。
汪峰你好