JAVAMD5加密解密

MD5的全稱是Message-Digest Algorithm 5,Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。MD5將任意長度的"字節串"變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因爲原始的字符串有無窮多個,這有點象不存在反函數的數學函數。


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];}//返回32位的字符串

System.out.println();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("liusb的MD5加密後:\n" + test_MD5.MD5("liusb")); 

}

輸出結果:

caidao的MD5加密後:
cdd7b7420654eb16c1e1b748d5b7c5b8
baidu的MD5加密後:
bfe279945c6109d067bcd295b5189d86

    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值的情況下才可以。

/** * 加密解密算法 執行一次加密,兩次解密 */ 

public static String convertMD5(String inStr){ 

char[] a = inStr.toCharArray(); 

for (int i = 0; i < a.length; i++){

 a[i] = (char) (a[i] ^ 't'); 

String s = new String(a); 

return s;

 } 

public static void main(String[] args) {

 String s = new String("tangfuqiang"); 

System.out.println("原始:" + s); 

System.out.println("MD5後:" + test_MD5.MD5(s)); 

System.out.println("加密的:" + convertMD5(s)); 

System.out.println("解密的:" + convertMD5(convertMD5(s))); 

}

驗證結果:

原始:tangfuqiang
MD5後:20b75697d8bf931a6730662ae117c3bf
加密的:

解密的:tangfuqiang


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章