最近連續幾個人反映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系列,也分些子塊。整體上單個系列的硬件管腳兼容性很好,資源和功能方面整體上是一致的,但不同子系列或型號間還是有些差異。這些細微差異往往在芯片數據手冊上都會有體現,作為工程開發人員,對你關注的資源或功能如果能事先做些確認比較好,否則無意中可能自己給自己挖坑了。
【拋磚引玉 旨在交流,如有錯疏 歡迎賜教】