MD5將任意長度的"字節串"變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然后再去和系統中保存的MD5值進行比較,而系統並不"知道"用戶的密碼是什么。
一些黑客破獲這種密碼的方法是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然后再用目標的MD5值在這個字典中檢索。
public class Md5Test {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = "aaabbb";
String s3 = "aaabbbccc";
String s4 = "aaabbbccc";
String s5 = "aaabbbccc";
String s6 = "aaa@#Q!3";
String res1 = DigestUtils.md5DigestAsHex(s1.getBytes());
String res2 = DigestUtils.md5DigestAsHex(s2.getBytes());
String res3 = DigestUtils.md5DigestAsHex(s3.getBytes());
String res4 = DigestUtils.md5DigestAsHex(s4.getBytes());
byte[] res5 = DigestUtils.md5Digest(s5.getBytes());
String res6 = DigestUtils.md5DigestAsHex(s6.getBytes());
System.out.println("res1:"+res1);
System.out.println("res2:"+res2);
System.out.println("res3:"+res3);
System.out.println("res4:"+res4);
System.out.println("res5:"+res5.toString());
System.out.println("res6:"+res6);
}
}
res1:47bce5c74f589f4867dbd57e9ca9f808
res2:6547436690a26a399603a7096e876a2d
res3:d1aaf4767a3c10a473407a4e47b02da6
res4:d1aaf4767a3c10a473407a4e47b02da6
res5:[B@10f87f48
res6:acb2e97d976f32b58caf093d42900792
對於res1,res2,res3解密網站很容易通過跑字典的形式獲得結果,但是對於res6這種復雜密碼,就很難通過跑字典獲取結果