MD5的全稱是Message-Digest Algorithm 5,由麻省理工學院計算機科學實驗室和RSA數據安全公司於20世紀90年代初發明,由MD2、MD3和MD4發展而來。
消息摘要(Message-Digest)壹般指消息的哈希變換,即將任意長度的字節串變換為具有壹定長度的大整數。請註意,我使用“字節字符串”壹詞而不是“字符串”,因為這種轉換只與字節值有關,與字符集或編碼方法無關。
MD5將任意長度的“字節字符串”轉換為128bit的大整數,它是壹種不可逆的字符串轉換算法。換句話說,即使您看到了源程序和算法的描述,您也無法將MD5值轉換回原始字符串。從數學上講,是因為有無限個原始字符串,有點像沒有反函數的數學函數。
MD5的典型應用是為消息(字節字符串)生成指紋以防止其被篡改。例如,如果您在壹個名為readme.txt的文件中寫了壹段話,並為此readme.txt生成壹個MD5值並記錄下來,那麽您可以將此文件傳播給他人。如果其他人修改了文件中的任何內容,您將在重新計算該文件的MD5時發現它。如果有第三方認證機構,MD5還可以防止文檔作者的“否認”,也就是所謂的數字簽名應用。
MD5也廣泛用於加密和解密技術。在許多操作系統中,用戶的密碼以MD5值的形式保存(或類似的其他算法)。當用戶登錄時,系統將用戶輸入的密碼計算為MD5值,然後與系統中保存的MD5值進行比較,但系統並不“知道”用戶的密碼是什麽。
壹些黑客破解這種密碼的方法是壹種叫做“運行字典”的方法。獲取字典的方法有兩種,壹種是日常收集的用作密碼的字符串表,另壹種是通過排列組合方法生成的。首先通過MD5程序計算這些字典項的MD5值,然後在該字典中搜索目標的MD5值。
即使密碼的最大長度為8,並且密碼只能是字母和數字,***26+26+10=62個字符,字典中的條目數也是p(62,1)+p(62,2)...+p(62,8),那麽
在許多電子商務和社區應用程序中,管理用戶帳戶是最常用的基本功能之壹。盡管許多應用服務器都提供了這些基本組件,但許多應用程序開發人員更喜歡使用關系數據庫來管理用戶,以獲得更大的管理靈活性。懶惰的方法是用戶的密碼通常在純文本或簡單轉換後直接存儲在數據庫中。因此,這些用戶的密碼對於軟件開發人員或系統管理員來說可以說不是秘密。本文的目的是介紹MD5的Java Bean的實現,同時給出壹個使用MD5處理用戶帳戶密碼的例子。這種方法使管理員和程序員無法看到用戶的密碼,盡管他們可以初始化密碼。但壹定要保護好用戶的密碼設置習慣。
感興趣的讀者可以獲得MD5的文本,即RFC 1321。
http://www.ietf.org/rfc/rfc1321.txt
// -
MD5算法描述
首先,補位
第二,補充數據的長度
第三,初始化MD5參數
四、處理位操作功能
五、主要改造過程
六、輸出結果
補充:
MD5算法首先補充輸入數據,因此數據位長度LEN對512的補充結果為448。也就是說,數據被擴展為K*512+448位。即K*64+56字節,K為整數。
具體填充操作:填充a 1,然後填充0,直到滿足上述要求。
補充數據長度:
用壹個64位的數字來表示數據的原始長度b,用兩個32位的數字來表示b .此時,數據的長度被填充為512位的倍數。
初始化MD5參數:
四個32位整數(A、B、C、D)用於計算消息摘要,十六進制數用於初始化。
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
處理位操作功能:
x、y和z是32位整數。
f(X,Y,Z)= X & amp;y | NOT(X)& amp;Z
g(X,Y,Z)= X & amp;Z|Y?(Z)
h(X,Y,Z)= X異或Y異或Z
I(X,Y,Z)= Y xor(X | not(Z))
主要轉換過程:
常數數組T【1...64】,其中T【I】是以十六進制16表示的32位整數,數據以16 32位整數數組M【】表示。
具體流程如下:
/*處理原始數據*/
對於i = 0至N/16-1 do
/*每次都將原始數據存儲在16個元素的數組X中。*/
對於j = 0到15 do
將X【j】設置為M【I * 16+j】。
結束j的循環。
/*將A另存為AA,B另存為BB,C另存為CC,D另存為d D。*/
AA = A
BB = B
CC = C
DD = D
/* Round 1 */
/*以下運算A = b+((A+f(B,c,d)+x【k】+t【I】)由【abcd k s i】表示
/*執行以下16操作。*/
【DABC 1 12 2】【CDAB 2 17 3】【BCDA 322 4】
【DABC 5 12 6】【CDAB 6 17 7】【BCDA 722 8】
【DABC 9 12 10】【CDAB 10 17 11】【bcda 1112】
【DABC 14 15】【CDAB 14 17 15】【BCDA 15 22 16】
/*第二輪* */
/*以下運算A = b+((A+G(B,C,D)+X【K】+T【I】)由【abcd k s i】表示
/*執行以下16操作。*/
【DABC 6 9 118】【CDAB 11 14 19】【bcda 0 20 20】
【DABC 10 9 22】【CDAB 15 14 23】【BCDA 4 20 24】
【DABC 14 9 26】【CDAB 314 27】【巴塞爾公約8 20 28】
【DABC 2 9 30】【CDAB 7 14 31】【bcda 12 20 32】
/*第三輪*/
/*以下運算A = b+((A+H(B,C,D)+X【K】+T【I】)由【abcd k s i】表示
/*執行以下16操作。*/
【ABCD 5 4 33】【DABC 8 11 34】【CDAB 11 16 35】【BCDA 14 23 36】
【DABC 4 11 38】【CDAB 7 16 39】【bcda 10 23 40】
【DABC 0 11 42】【CDAB 3 16 43】【BCDA 6 23 44】
【DABC 12 11 46】【CDAB 15 16 47】【BCDA 2 23 48】
/*第4輪*/
/*以下運算A = b+((A+I(B,C,D)+X【K】+T【I】)由【abcd k s i】表示
/*執行以下16操作。*/
【DABC 7 10 50】【CDAB 14 15 51】【BCDA 5 21 52】
【DABC 3 10 54】【CDAB 10 15 55】【BCDA 1 21 56】
【DABC 15 10 58】【CDAB 615 59】【BCDA 13 21 60】
【DABC 11 1 10 62】【CDAB 2 15 63】【BCDA 9 21 64】
/*然後執行以下操作*/
A = A + AA
B = B + BB
C = C + CC
D = D + DD
End /*結束I */的循環
輸出結果。