聊一聊MD5

轉自: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一次呢


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章