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對象
MessageDigestmdTemp=MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[]md=mdTemp.digest();
intj=md.length;
charstr[]=newchar[j*2];
intk=0;
for(inti=0;i<j;i++){
byteb=md[i];
//System.out.println((int)b);
//將沒數(int)b進行雙位元組加密
str[k++]=hexDigits[b>>4&0xf];
str[k++]=hexDigits[b&0xf];
}
returnnewString(str);
}catch(Exceptione){returnnull;}
}
//測試
publicstaticvoidmain(String[]args){
System.out.println("caidao的MD5加密後:/n"+Test_MD5.MD5("caidao"));
System.out.println("//www.VeVB.COm/的MD5加密後:/n"+Test_MD5.MD5("//www.VeVB.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值的情況下才可以。