首頁 >Java >java教程 >java MD5加密演算法

java MD5加密演算法

伊谢尔伦
伊谢尔伦原創
2016-12-10 09:19:171490瀏覽

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可以對一個對一個任意大小的檔案進行加密運算,得到一個唯一的32位元字串.

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

java程式碼實作MD5加密 

複製程式碼 
package com.wang.encryption; 
import com.sun.org.apache.xerces.internal.impl.dv.utilport 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);
}

}

fc5e038d38a57032085441e7fe7010b0 
fc5e038d38a57032085441e7fe7010b0

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的描述如下:

public abstract class MessageDigest的描述如下:

public abstract class MessageDig; MessageDigest.getInstance(“SHA”);

try {

extends MessageDigestSpi
  此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
  MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。
  对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。
  实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:

} catch (CloneNotSupportedException cnse) {

md.update(toChapter1);
 MessageDigest tc1 = md.clone();
 byte[] toChapter1Digest = tc1.digest();
 md.update(toChapter2);
 ...etc.

}

摘要

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

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

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

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

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

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

  雖然MD5是一種不可逆的算法,但並不意味著不可破解,大多數用戶設置密碼時都會使用比較有特殊意義的字段,比如生日,名字簡拼,等,如果我把你的相關的信息,猜測出你可能會使用的密碼,然後把他們都用MD5加密一遍,就得到很多個密文,再拿到你的密碼的密文和我的密文庫裡一一對比,如果密文能匹配,那麼你的密碼本身也就不攻自破了. 


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