最近连续几个人反映STM32F4系列芯片的MD5结果问题,都反映在使用STM32F4的库函数做MD5计算时得出的结果均为0,甚为迷惑不解。后来我发现网络上也有这方面的咨询,基本都没有回复结果。
所谓MD5,它是Message Digest Algorithm MD5(中文名为消息摘要算法第五版)的简称。主要用于确保信息传输完整一致。是计算机或微处理器广泛使用的杂凑算法之一(又称摘要算法、哈希算法)。将数据(如各类文件信息)通过一系列运算后得出另一固定长度的信息,仿佛从原始信息中生成一部分摘要出来。MD5的前身还有MD2、MD3和MD4。
利用哈希算法生成MD5信息的大致原理就是对一堆原始信息经过哈希算法后生成一个固定长度而并无规律的数据信息。这个信息可以用来检测原始信息的完整性,进而达到保证原始信息的完整和安全性。
比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用户重新使用相同算法计算下载文件的MD5值,通过比较这两个值是否相同,来判断下载的文件是否出错,或者说下载的文件是否被篡改了。再比方说用户在银行设置操作密码,其实存进银行系统的并不是你敲入的那几个数字,而是根据输入的密码数字生成的类似MD5的数据信息,跟你键入的密码数字并无直接的或有规律的关系。所以你不用担心银行工作人员通过内部系统看到你输入的是什么密码。
好,言归正传。回到刚才STM32F4芯片MD5计算值为0的话题。我之前也没用过STM32做MD5,印象中STM32F4系列是带HASH处理器,支持MD5的。既然人家问STM32F4的芯片,那我就顺手找了块STM32F407 DISCOVERY[探索板]做测试。下载了SMT32F4系列最新传统固件库,下载最新版本好处不必多说。
ST官方提供的固件库里面有现存的关于HASH的工程项目。
我使用上面椭圆圈里的工程文件,稍加调整,运行工程。结果跟客户说的一样,MD5的输出值全0. 结合ST MCU参考手册和代码前前后后看了下,也没发现啥问题。
想到ST 官方不是有另外一个CUBE库吗?立即打开建立了工程,编译、运行一路正常。遗憾的是MD5结果还是0.
潜意识告诉我,手里的STM32F405 DISCOVERY上面的主芯片是STM32F407VG,会不会不支持HASH,或者说他根本不带HASH处理器?心想STMF4系列里面,STM32F429算是比较高端的了,它总该带HASH吧【自以为是在作怪了。。。】。
又找了个STM32F429的DISCOVERY学习板,搭建工程测试,效果照旧。到此,只得去找芯片的数据手册做确认。确认后发现STM32F429、STM32F407芯片都不带HASH 处理器,看来MD5结果为0就不难理解了。到此问题答案也算出来了。
为了保险起见,还是找了颗带HASH的STM32芯片测试了下,测试结果果真不再总为0了。如果修改相关输入信息,MD5值也立即改变。有兴趣的人可以玩玩,上面的两副图是2次MD5的结果,我只是把第一种情形的输入数字改了一个字符,那MD5结果就大相径庭。
从上面的分析和实践看来,客户反映的MD5结果总为0是因为所使用的32F4芯片根本不带HASH处理器所致。后来进一步跟客户沟通也确认他使用的F4芯片是不带HASH功能的。
那对于STM32F4系列哪些带HASH处理器,可以用来做MD5的应用呢?相关芯片是否支持HASH,各芯片数据手册里一定有介绍,在手册的首页就有提。顺便提醒下,尽量看英文手册,或者中英结合看,不建议英文原版扔一边只看中文。
我这里大致整理下。下图中红色圆圈圈出来的芯片都带HASH,可以做MD5应用。
其实,除了STM32F4系列外,stm32f2系列也支持加密处理,带HASH处理器。
小结下:STM32系列众多,即使某个系列,比方STM32F4系列,也分些子块。整体上单个系列的硬件管脚兼容性很好,资源和功能方面整体上是一致的,但不同子系列或型号间还是有些差异。这些细微差异往往在芯片数据手册上都会有体现,作为工程开发人员,对你关注的资源或功能如果能事先做些确认比较好,否则无意中可能自己给自己挖坑了。
【抛砖引玉 旨在交流,如有错疏 欢迎赐教】