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),作用和上面我舉得例子類似(我覺得是這樣....).
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); } }
運行程式碼,得到的輸出結果如下:
這裡主要介紹一下,java中MessageDigest這個類別,查看jdk的開發文件,可以看到該類別位於java.security包下,文檔對MessageDigest的描述如下:類別為應用程式提供資訊摘要演算法的功能,如MD5 或SHA 演算法。資訊摘要是安全的單向雜湊函數,它接收任意大小的數據,輸出固定長度的雜湊值。
MessageDigest 物件開始初始化。該物件透過使用 update 方法處理資料。任何時候都可以呼叫 reset 方法重置摘要。一旦所有需要更新的資料都已經被更新了,應該呼叫 digest 方法之一來完成雜湊計算。
實作可隨意選擇是否實作 Cloneable 介面。客戶端應用程式可以透過嘗試複製和捕獲CloneNotSupportedException 測試可複製性:
public abstract class MessageDigest extends MessageDigestSpi
注意,如果給定的實作是不可複製的,而事先已知摘要的數目,則仍然能夠透過實例化幾個實例計算中間摘要。
MD5的應用領域主要可以分為以下幾類:
2、防止直接看到明文(口令加密),現在很多網站在資料庫儲存使用者的密碼的時候都是儲存使用者密碼的MD5值。這樣就算不法分子得到資料庫的使用者密碼的MD5值,也無法知道使用者的密碼。
3、防止抵賴(數位簽章),例如A寫了一個文件,認證機構對此文件用MD5演算法產生摘要資訊並做好記錄。這樣可以防止出現日後A不承認此事而帶來的麻煩。
雖然MD5是一種不可逆的算法,但並不意味著不可破解,大多數用戶設置密碼時都會使用比較有特殊意義的字段,比如生日,名字簡拼,等,如果我把你的相關的訊息,猜測出你可能會使用的密碼,然後把他們都用MD5加密一遍,就得到很多個密文,再拿到你的密碼的密文和我的密文庫裡一一對比,如果密文能匹配,那麼你的密碼本身也就不攻自破了.同樣的道理,現在有很多網站有提供了一些在線的MD5值查詢功能,輸入MD5密碼值後,如果在數據庫中存在,那麼可以很快獲取其密碼值,道理也是一樣的,比如上面代碼中我是對"helloworld"這個字符串進行MD5加密,理論上你只知道密文是不可能破解我的原始數據的,但事實上真的是這樣嗎? 來看一個網站http://pmd5.com/
我輸入上面程式碼產生的密文之後,網站一下子就破解了,原理也就很簡單了.
子關於MD5更更細緻的文字資料,可以移步百度百科,介紹的挺細緻的,值得一看.