首頁  >  文章  >  类库下载  >  java MD5加密演算法

java MD5加密演算法

高洛峰
高洛峰原創
2016-11-05 10:18:211737瀏覽

  MD5(Message Digest Algorithm 5),翻譯過來是訊息摘要演算法第五版,按照慣例,我們推理可能也有MD2,MD3這樣名字的歷史版本..

     即使完全不了解這個演算法的原理,我們也可以從命名中看出一些眉道,所謂摘要,就是一個簡短的概括,像我寫過的畢業論文,上來第一部分就是摘要,它對後面長篇大論的文章做了一個簡短有力的概括,其實MD5的作用也有點這樣的味道,我們來看一段關於描述MD5算法作用的文字:

  MD5的作用是讓大容量信息在用數字簽名軟體簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組字串變換成一定長的大整數),它主要用於確保資料傳輸的完整性和一致性.

  假設A要給遠方的B發送一個文字檔,有100萬字,當B收到文件的時候,該怎麼知道這個文件在傳過來的途中有沒有被篡改呢,要是有人中途截斷並篡改了文件內容那就不太妙了,這時候MD5就派上用場了,不管多大的文件,通過MD5加密之後都會得到一個定長的字符串,一般是32位,這時候A先對文件用MD5加密一下,得到的一串密文順便也傳給B,當B收到後文件,同樣對文件用MD5加密一下,看看得到的密文是否和A傳過來的一致,如果一致,說明這個文件是安全的.這樣就確保了數據傳輸的完整性.

事實上,我們從網路上下載檔案的時候,有時候下載的檔案後面都有一段MD5的密文,例如MD5(e8027a87676ea48b3a3c9b0a4d8d87a0),作用和上面我舉得例子類似(我覺得是這樣....).


MD5是一種公開的不可逆的演算法,意味著是沒有辦法直接破解密文得到來源資料資訊的,md5可以對一個對一個任意大小的檔案進行加密運算,得到一個唯一的32位元字串.


簡單了解了MD5的功能,就可以直接看程式碼了.


java程式碼實作MD5加密

package com.wang.encryption;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.MessageDigest;
/**
 * @author yogo.wang
 * @date 2016/11/04-下午1:02.
 */
public class MD5Test {
    public static String md5Encode(String msg) throws Exception{

        byte[] msgBytes = msg.getBytes("utf-8");
        /**
         * 声明使用Md5算法,获得MessaDigest对象
         */
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        /**
         * 使用指定的字节更新摘要
         */
        md5.update(msgBytes);
        /**
         * 完成哈希计算,获得密文
         */
        byte[] digest = md5.digest();
        /**
         * 以上两行代码等同于 byte[] digest = md5.digest(msgBytes);
         */
        return bytesToHexString(digest);
    }
    /**
     * 将byte数组转化为16进制字符串形式
     * @param bys
     * @return
     */
    public static String byteArr2hexString(byte[] bys){
        StringBuffer hexVal=new StringBuffer();
        int val=0;
        for (int i = 0; i < bys.length; i++) {
            //将byte转化为int  如果byte是一个负数就必须要和16进制的0xff做一次与运算
            val=((int)bys[i]) & 0xff;
            if(val<16){
                hexVal.append("0");
            }
            hexVal.append(Integer.toHexString(val));
        }

        return hexVal.toString();

    }

    public static void main(String[] args) throws Exception {
        String msg="helloworld";
        String result=md5Encode(msg);
        String result1=md5Encode(msg);
        System.out.println(result);
        System.out.println(result1);
    }

}

運行程式碼,得到的輸出結果如下:

fc5e038d38a5703208544187850206 41e7fe7010b0

  可見,對同一個字段進行加密,得到的密文總是一致的.接下來看一下MD5實現的原理和應用.

MD5實現原理及應用

  我看了一些網上的朋友自己實現的md5加密的代碼,只能說半知半解,這裡貼一下,網路上的一些實現的步驟介紹(隨便看看就好).


MD5就好).


  1)填充:首先將輸入訊息的長度(bit)進行填充,使得512求餘的結果等於448。填充的方法是填滿一個1和n個0。


  2)記錄資訊長度:用64位元來儲存填充前資訊長度。這64位元加在第一步結果的後面,這樣訊息長度就變成N*512+448+64=(N+1)*512位元。


  3)裝入標準的幻數:標準的幻數是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程式中定義應該是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。


  4)四輪循環運算:循環的次數是分組的個數(N+1)。


  這裡主要介紹一下,java中MessageDigest這個類別,查看jdk的開發文件,可以看到該類別位於java.security包下,文檔對MessageDigest的描述如下:類別為應用程式提供資訊摘要演算法的功能,如MD5 或SHA 演算法。資訊摘要是安全的單向雜湊函數,它接收任意大小的數據,輸出固定長度的雜湊值。

      MessageDigest 物件開始初始化。該物件透過使用 update 方法處理資料。任何時候都可以呼叫 reset 方法重置摘要。一旦所有需要更新的資料都已經被更新了,應該呼叫 digest 方法之一來完成雜湊計算。

      對於給定數量的更新數據,digest 方法只能被呼叫一次。 digest 被呼叫後,MessageDigest 物件被重新設定成其初始狀態。

      實作可隨意選擇是否實作 Cloneable 介面。客戶端應用程式可以透過嘗試複製和捕獲CloneNotSupportedException 測試可複製性:

public abstract class MessageDigest
    extends MessageDigestSpi

注意,如果給定的實作是不可複製的,而事先已知摘要的數目,則仍然能夠透過實例化幾個實例計算中間摘要。

  主要方法的作用,在上面程式碼的註解中已經給出,這裡就不在介紹了.

  MD5的應用領域主要可以分為以下幾類:


檔案完整性驗證),例如我提供檔案下載,為了防止不法分子在安裝程式中加入木馬,我可以在網站上公佈由安裝檔得到的MD5輸出結果。

2、防止直接看到明文(口令加密),現在很多網站在資料庫儲存使用者的密碼的時候都是儲存使用者密碼的MD5值。這樣就算不法分子得到資料庫的使用者密碼的MD5值,也無法知道使用者的密碼。

3、防止抵賴(數位簽章),例如A寫了一個文件,認證機構對此文件用MD5演算法產生摘要資訊並做好記錄。這樣可以防止出現日後A不承認此事而帶來的麻煩。

  雖然MD5是一種不可逆的算法,但並不意味著不可破解,大多數用戶設置密碼時都會使用比較有特殊意義的字段,比如生日,名字簡拼,等,如果我把你的相關的訊息,猜測出你可能會使用的密碼,然後把他們都用MD5加密一遍,就得到很多個密文,再拿到你的密碼的密文和我的密文庫裡一一對比,如果密文能匹配,那麼你的密碼本身也就不攻自破了.同樣的道理,現在有很多網站有提供了一些在線的MD5值查詢功能,輸入MD5密碼值後,如果在數據庫中存在,那麼可以很快獲取其密碼值,道理也是一樣的,比如上面代碼中我是對"helloworld"這個字符串進行MD5加密,理論上你只知道密文是不可能破解我的原始數據的,但事實上真的是這樣嗎? 來看一個網站http://pmd5.com/

java MD5加密演算法

我輸入上面程式碼產生的密文之後,網站一下子就破解了,原理也就很簡單了.

  子關於MD5更更細緻的文字資料,可以移步百度百科,介紹的挺細緻的,值得一看. 


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn