原文網址:http://www.cnblogs.com/xudong-bupt/archive/2013/05/10/3070899.html
(1)一般使用的數據庫中都會保存用戶名和密碼,其中密碼不使用明碼保存。
有時候用MD5密碼,很多語言都提供了將字符串生成為MD5密碼的方法或函數。MD5的加密算法是公開的。
有時候也可以用自己的字符串加密算法,這種加密算法是只有自己知道的。
(2)破解MD5的過程就是先算好大量或者所有可能的字符串的MD5數值,之后進行查詢就可以破解。雖然有些網站規定了密碼的位數在6~20位之間,但是要事先計算這么多是字符串並有效的組織存儲、查詢還是相當麻煩,相當慢的。
因為MD5的位數是固定的,比如16,32,64,而字符串的組合與長度是無窮盡的,這就有沖突啦。但是如果知道了加密前字符串的長度是有固定范圍的,比如6~20,這個還是可以破解的。
但是,如果不知道加密前字符的長度那么這就是無窮盡啦。貌似現在還沒有人能夠破解吧。
MD5密碼破解網站 :http://www.cmd5.com/
(3)下面給出了一個java生成給定字符串的MD5密碼的模塊程序。
import java.security.MessageDigest;
public class Md5Test {
public void toMD5(String plainText) {
try {
//生成實現指定摘要算法的 MessageDigest 對象。
MessageDigest md = MessageDigest.getInstance("MD5");
//使用指定的字節數組更新摘要。
md.update(plainText.getBytes());
//通過執行諸如填充之類的最終操作完成哈希計算。
byte b[] = md.digest();
//生成具體的md5密碼到buf數組
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
System.out.println("32位: " + buf.toString());// 32位的加密
System.out.println("16位: " + buf.toString().substring(8, 24));// 16位的加密,其實就是32位加密后的截取
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String agrs[]) {
new Md5Test().toMD5("LXD");//加密LXD
}
}

