JAVA的MD5加密與解密

來源:互聯網
上載者:User
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值的情況下才可以。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.