轉自:http://www.weixuehao.com/archives/474
MD5是什麼
message-digest algorithm 5(信息-摘要算法)。經常說的“MD5加密”,就是它→信息-摘要算法。
在下載一下東西時,經常在一些壓縮包屬性裏,看到md5值。而且這個下載頁面,很可能會在某一個地方,寫了一句,此文件的MD5值爲XXXXXXXXX。這有什麼作用呢?
白話白話:md5,其實就是一中算法。可以將一個字符串,或文件,或壓縮包,執行md5後,就可以生成一個固定長度爲128bit的串。這個串,基本上是唯一的。
所以,有人修過壓縮包後,就會生成新的串,這時就可以拿網站提供的串和新生成的串對比,如果不同,那就是被人修過過了。
加密和摘要,是不一樣的
加密後的消息是完整的;具有解密算法,得到原始數據;
摘要得到的消息是不完整的;通過摘要的數據,不能得到原始數據;
所以,當看到很多人說,md5,加密,解密的時候,呵呵一笑就好了。
MD5長度
有人說md5,128位,32位,16位,到底md5多長?
md5的長度,默認爲128bit,也就是128個0和1的二進制串。
這樣表達是很不友好的。
所以將二進制轉成了16進制,每4個bit表示一個16進制,
所以128/4 = 32 換成16進製表示後,爲32位了。
爲什麼網上還有md5是16位的呢?
網上有很多帖子,md5 32位 16位 加密 區別。
仔細觀察admin生成的32位和16位的md5值……
查詢結果:
md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3
md5(admin,16) = 7a57a5a743894a0e
看出來了吧!
其實16位的長度,是從32位md5值來的。是將32位md5去掉前八位,去掉後八位得到的。
MD5的作用
①一致性檢驗,最上面那個例子
②數字簽名,還是最上面那個例子。只是把md5看出了一個指紋,按了個手印說明獨一無二了。
③安全訪問認證,這個就是平時系統設計的問題了。
在用戶註冊時,會將密碼進行md5加密,存到數據庫中。這樣可以防止那些可以看到數據庫數據的人,惡意操作了。
md5不能破解嗎?
md5是不可逆的,也就是沒有對應的算法,從生產的md5值逆向得到原始數據。
但是如果使用暴力破解,那就另說了。
md5是唯一的嗎?
md5作爲數據庫中的主鍵可行嗎?這就涉及到一個問題,md5值是唯一的嗎?答案是,不唯一。
也就是一個原始數據,只對應一個md5值;
但是一個md5值,可能對應多個原始數據。
java中生成MD5的值
public class MD5Test {
//main測試類
public static void main(String[] args) {
String result = getMD5("aaa");
System.err.println(result);
}
/**
* 生成md5
* @param message
* @return
*/
public static String getMD5(String message) {
String md5str = "";
try {
//1 創建一個提供信息摘要算法的對象,初始化爲md5算法對象
MessageDigest md = MessageDigest.getInstance("MD5");
//2 將消息變成byte數組
byte[] input = message.getBytes();
//3 計算後獲得字節數組,這就是那128位了
byte[] buff = md.digest(input);
//4 把數組每一字節(一個字節佔八位)換成16進制連成md5字符串
md5str = bytesToHex(buff);
} catch (Exception e) {
e.printStackTrace();
}
return md5str;
}
/**
* 二進制轉十六進制
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer();
//把數組每一字節換成16進制連成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i];
if(digital < 0) {
digital += 256;
}
if(digital < 16){
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toUpperCase();
}
}
MD5的詳細算法……自己搜吧。
====================分割線========================
以上是轉自wei的MD5教程,下面說說我在項目中的使用場景。
md5在登陸註冊時一般會使用,在註冊時,將密碼進行md5加密,將加密後的密碼存儲於服務端的數據庫中,這樣,客戶端每次登陸,都是將明文密碼md5加密之後與服務端進行對比,相同則登陸成功,不同則登錄失敗,這樣即使服務端數據庫泄露,別人也不會知道用戶的密碼是多少。
問下 密碼md5加密後保存在手機裏面,然後要做到自動填充密碼,但是也有可能用戶會自己修改密碼, 我怎樣判斷密碼框裏的內容需不需要再次md5一次呢