標籤:管理員 理論 .com ndk view 字母 作者 不能 使用者密碼
理解MD5
MD5的應用非常廣泛h5棋牌源碼租用(h5.hxforum.com)聯絡170618633533企鵝2952777280(http://yhgj8004.com)源碼出售 房卡出售 後台出租連絡方式只有企鵝。例如我們在unix中下載某種軟體時,常常會看到一個副檔名為.md5的檔案,內容大概是:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
這就是tanajiya.tar.gz檔案的數位簽章。因此當我們得到這個檔案後,使用工具計算該檔案對應的md5值,然後和檔案中記錄的.md5中記錄的值進行對比,如果不一致,就可以得知檔案內容發生了變化。
MD5演算法將整個檔案當作一個大文本資訊,通過其無法復原的字串變換演算法,產生了這個唯一的MD5資訊摘要。這就相當於這個檔案的指紋,如果有任何人修改了檔案內容,或下載檔案由於網路問題不完整,則產生的md5值也會發生變化。
MD5演算法本質是一個雜湊演算法,因此MD5值就是一個雜湊值。由這個例子可以得知MD5的一些特點:
1,對於同樣的檔案,計算出的MD5值永遠是一樣的。MD5演算法中沒有任何隨機數或不確定因素。
2,MD5演算法是公開的。因而我們可以找到很多個MD5產生器,但背後的演算法是一樣的。
3,我們可以認為世界上的檔案是無限的,而得到的MD5值永遠是一個128位位元。因此是一個無窮序列到一個有限序列的映射。進而可以得知,MD5演算法是無法復原的,也就是說,我們不能用一個MD5值來推算出源檔案的內容。
4,從無窮序列到有限序列的映射這點又可以推斷出,MD5演算法可能產生衝突(這也是所有雜湊函數都會遇到的問題)。即兩個不同的檔案,可能會產生一樣的MD5值。我們知道2^128次方是個巨大無比的數字,因此之前認為MD5的衝突在理論上存在,現實生活中遇到的可能性很低,因此是個可靠的演算法。然而近年研究出的碰撞演算法使得電腦在很短的時間內就可以得出一個可能的衝突值,這就是MD5演算法的缺陷。我們在後面會提到這種缺陷的危害。
MD5的其它應用
數位憑證
和前面的例子一樣,在發行軟體的時候,附帶一個MD5認證。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數位簽章應用。
安全認證
MD5還廣泛用於作業系統的登陸認證上,如Unix、各類BSD系統登入密碼、數位簽章等諸多方面。如在UNⅨ系統中使用者的密碼是以MD5(或其它類似的演算法)經Hash運算後儲存在檔案系統中。當使用者登入的時候,系統把使用者輸入的密碼進行MD5 Hash運算,然後再去和儲存在檔案系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道使用者密碼的明碼的情況下就可以確定使用者登入系統的合法性。這可以避免使用者的密碼被具有系統管理員許可權的使用者知道。如果使用者丟失了密碼,只能讓管理員重設密碼。
MD5的缺陷
前面提到MD5的破解演算法,也稱為碰撞演算法。本質就是對於一個給定的MD5,在很短的時間內就能找到可能的源檔案內容。前面提到MD5演算法是無法復原的,也就是說破解演算法不能保證得到的一定是源檔案內容,但是能保證該檔案內容計算出的MD5值一定和源檔案產生的MD5相同。我們來看看這有什麼危害:比如使用者的登入密碼為666666,後台資料庫儲存的是MD5值,假如是0ca175b9c0f726a831d895e269332461。破解的人拿到這個MD5值,使用破解演算法計算出和這個MD5碰撞的密碼,假如是678865。
這樣破解的人就可以使用678865去登入,由於MD5的輸出還是0ca175b9c0f726a831d895e269332461,因此這個人就可以順利登入。
對於這個問題,一個很容易的解決方案是,將使用者輸入的初始密碼複製一份,變成666666666666,然後產生MD5,存入資料庫。這樣破解演算法得到的可能的密碼就不再是678865了,他也無法用這個可能密碼去登入。
除了碰撞演算法破解以外,現在被駭客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的暴力破解方法(brute force)。有兩種方法得到字典,一種是日常搜集的用做密碼的字串表,另一種是用排列組合方法產生的,先用MD5程式計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。我們假設密碼的最大長度為8位位元組(8 Bytes),同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,儲存這個字典就需要TB級的磁碟陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。這種加密技術被廣泛的應用於UNⅨ系統中,這也是為什麼UNⅨ系統比一般作業系統更為堅固一個重要原因。
簡單MD5類
[java] view plain copy
import java.security.MessageDigest;
public class MD5Demo {
public static class MD5_test { 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(); 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 byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf ]; str[k++] = hexDigits[byte0 & 0xf ]; } return new String(str); } catch (Exception e) { return null ; } } public static void main(String[] args) {
// MD5_test aa = new MD5_test();
System.out.print(MD5_test.MD5("b" ));
}
}
}
加密----------解密 MD5類
[java] view plain copy
import java.security.MessageDigest;
public class MD5andKL {
// MD5加碼。32位
public static String MD5(String inStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
// 可逆的密碼編譯演算法
public static String KL(String inStr) {
// String s = new 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 String JM(String inStr) {
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^ ‘t‘);
}
String k = new String(a);
return k;
}
// 測試主函數
public static void main(String args[]) {
String s = new String("a");
System.out.println("原始:" + s);
System.out.println("MD5後:" + MD5(s));
System.out.println("MD5後再加密:" + KL(MD5(s)));
System.out.println("解密為MD5後的:" + JM(KL(MD5(s))));
}
}
h5棋牌源碼租用Java的MD5加密和解密類