MD5的全稱是Message-Digest Algorithm 5,由麻省理工學院計算機科學實驗室和RSA數據安全公司在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),那麽
在許多電子商務和社區應用中,管理用戶帳戶是最常用的基本功能之壹。盡管許多應用服務器提供了這些基本組件,但許多應用程序開發人員更喜歡使用關系數據庫來管理用戶,以獲得更大的管理靈活性。懶惰的方法是,用戶的密碼通常在經過純文本或簡單轉換後直接存儲在數據庫中。所以這些用戶的密碼對於軟件開發者或者系統管理員來說,可以說已經不是什麽秘密了。本文的目的是介紹Java Bean的MD5的實現,同時給出壹個用MD5處理用戶帳號密碼的例子。這種方法使得管理員和程序員無法看到用戶的密碼,盡管他們可以初始化密碼。但是保護用戶的密碼設置習慣很重要。
感興趣的讀者可以得到MD5的文本,即RFC 1321。
http://www.ietf.org/rfc/rfc1321.txt
// -
MD5算法描述
首先,填補職位空缺
第二,補充數據的長度
第三,初始化MD5參數
四、加工位操作功能
五、主要轉化過程
六、輸出結果
補充:
MD5算法首先對輸入數據進行補碼,這樣數據位長度LEN補碼到512的結果就是448。即數據擴展到K*512+448位。即K*64+56字節,K為整數。
具體填充操作:先填壹個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 xor Y xor 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做
設置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操作。*/
[ABCD 0 7 1][DABC 1 12 2][CDAB 2 17 3][BCDA 322 4]
[ABCD 4 7 5][DABC 5 12 6][CDAB 6 17 7][BCDA 722 8]
[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][bcda 111 22 12]
[ABCD 12 7 13][DABC 13 12 14][CDAB 14 17 15][BCDA 15 22 16]
/*第二輪* */
/*下面的運算A = B+((A+G (B,C,D)+X [K]+T [I])用[abcd k s i]表示
/*做以下16操作。*/
[ABCD 1 5 17][DABC 6 9 18][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][巴塞爾公約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]
[ABCD 1 4 37][DABC 4 11 38][CDAB 7 16 39][bcda 10 23 40]
[ABCD 13 4 41][DABC 0 11 42][CDAB 3 16 43][BCDA 6 23 44]
[ABCD 9 4 45][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操作。*/
[ABCD 0 6 49][DABC 7 10 50][CDAB 14 15 51][BCDA 5 21 52]
[ABCD 12 6 53][DABC 3 10 54][CDAB 10 15 55][BCDA 1 21 56]
[ABCD 8 6 57][DABC 15 10 58][CDAB 6 15 59][BCDA 13 21 60]
[ABCD 4 6 61][DABC 11 10 62][CDAB 2 15 63][BCDA 9 21 64]
/*然後執行以下操作*/
A = A + AA
B = B + BB
C = C + CC
D = D + DD
End /*結束I */的循環
輸出結果。
(本文中文翻譯自《新世紀》余飛宇。特此聲明,謝謝!)