1. 程式人生 > >h5棋牌源碼租用Java的MD5加密和解密類

h5棋牌源碼租用Java的MD5加密和解密類

哈希函數 網絡問題 pri rgs update array 重要 和數 下載

理解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加密和解密類