MD5的全稱是Message-Digest Algorithm 5,Message-Digest泛指位元組串(Message)的Hash變換,就是把一個任意長度的位元組串變換成一定長的大整數。MD5將任意長度的"位元組串"變換成一個128bit的大整數,並且它是一個無法復原的字串變換演算法,換句話說就是,即使你看到來源程式和演算法描述,也無法將一個MD5的值變換回原始的字串,從數學原理上說,是因為原始的字串有無窮多個,這有點象不存在反函數的數學函數。import java.security.MessageDigest;public class Test_MD5{public final static String MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] strTemp = s.getBytes(); //使用MD5建立MessageDigest對象 MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte b = md[i]; //System.out.println((int)b); //將沒個數(int)b進行雙位元組加密 str[k++] = hexDigits[b >> 4 & 0xf]; str[k++] = hexDigits[b & 0xf]; } return new String(str); } catch (Exception e) {return null;} } //測試public static void main(String[] args) { System.out.println("caidao的MD5加密後:/n"+Test_MD5.MD5("caidao")); System.out.println("
http://www.baidu.com/的MD5加密後:/n"+Test_MD5.MD5("
http://www.baidu.com/"));}}
MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被"篡改"。舉個例子,你將一段話寫在一個叫readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的"抵賴",這就是所謂的數字****應用。
MD5還廣泛用於加密和解密技術上,在很多作業系統中,使用者的密碼是以MD5值(或類似的其它演算法)的方式儲存的,使用者Login的時候,系統是把使用者輸入的密碼計算成MD5值,然後再去和系統中儲存的MD5值進行比較,而系統並不"知道"使用者的密碼是什麼。MD5理論上是一種單向的雜湊散列,一些駭客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字串表,另一種是用排列組合方法產生的,先用MD5程式計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)....+P(62,8),那也已經是一個很天文的數字了,儲存這個字典就需要TB級的磁碟組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。import java.security.MessageDigest;public class Test_MD5{public final static String MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] strTemp = s.getBytes(); //使用MD5建立MessageDigest對象 MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte b = md[i]; //System.out.println((int)b); //將沒個數(int)b進行雙位元組加密 str[k++] = hexDigits[b >> 4 & 0xf]; str[k++] = hexDigits[b & 0xf]; } return new String(str); } catch (Exception e) {return null;} } //測試public static void main(String[] args) { System.out.println("caidao的MD5加密後:/n"+Test_MD5.MD5("caidao")); System.out.println("
http://www.baidu.com/的MD5加密後:/n"+Test_MD5.MD5("
http://www.baidu.com/"));}}
MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被"篡改"。舉個例子,你將一段話寫在一個叫readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的"抵賴",這就是所謂的數字****應用。
MD5還廣泛用於加密和解密技術上,在很多作業系統中,使用者的密碼是以MD5值(或類似的其它演算法)的方式儲存的,使用者Login的時候,系統是把使用者輸入的密碼計算成MD5值,然後再去和系統中儲存的MD5值進行比較,而系統並不"知道"使用者的密碼是什麼。MD5理論上是一種單向的雜湊散列,一些駭客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字串表,另一種是用排列組合方法產生的,先用MD5程式計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)....+P(62,8),那也已經是一個很天文的數字了,儲存這個字典就需要TB級的磁碟組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。