MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD二、MD3和MD4發展而來。
Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成必定長的大整數。請注意我使用了「字節串」而不是「字符串」這個詞,是由於這種變換隻與字節的值有關,與字符集或編碼方式無關。
MD5將任意長度的「字節串」變換成一個128bit的大整數,而且它是一個不可逆的字符串變換算法,換句話說就是,即便你看到源程序和算法描述,也沒法將一個MD5的值變換回原始的字符串,從數學原理上說,是由於原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,而後你能夠傳播這個文件給別人,別人若是修改了文件中的任何內容,你對這個文件從新計算MD5時就會發現。若是再有一個第三方的認證機構,用MD5還能夠防止文件做者的「抵賴」,這就是所謂的數字簽名應用。
MD5還普遍用於加密和解密技術上,在不少操做系統中,用戶的密碼是以MD5值(或相似的其它算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,而後再去和系統中保存的MD5值進行比較,而系統並不「知道」用戶的密碼是什麼。
一些黑客破獲這種密碼的方法是一種被稱爲「跑字典」的方法。有兩種方法獲得字典,一種是平常蒐集的用作密碼的字符串表,另外一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,而後再用目標的MD5值在這個字典中檢索。
即便假設密碼的最大長度爲8,同時密碼只能是字母和數字,共26+26+10=62個字符,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已是一個很天文的數字了,存儲這個字典就須要TB級的磁盤組,並且這種方法還有一個前提,就是能得到目標帳戶的密碼MD5值的狀況下才能夠。
在不少電子商務和社區應用中,管理用戶的Account是一種最經常使用的基本功能,儘管不少Application Server提供了這些基本組件,但不少應用開發者爲了管理的更大的靈活性仍是喜歡採用關係數據庫來管理用戶,懶惰的作法是用戶的密碼每每使用明文或簡單的變換後直接保存在數據庫中,所以這些用戶的密碼對軟件開發者或系統管理員來講能夠說毫無保密可言,本文的目的是介紹MD5的Java Bean的實現,同時給出用MD5來處理用戶的Account密碼的例子,這種方法使得管理員和程序設計者都沒法看到用戶的密碼,儘管他們能夠初始化它們。但重要的一點是對於用戶密碼設置習慣的保護。 算法