MD5演算法普遍用於數位簽章技術
數位簽章技術:可以檢測檔案或其他應用的完整性,判斷有無修改;
簡單應用如下:
假設通訊的兩端,一端為檔案的寄件者,而另一端為檔案的接受者。
發送端:寄件者對所發送的檔案調用相關的函數來產生該檔案的摘要資訊,然後將該摘要資訊用其本人的私密金鑰進行加密處理,將摘要資訊的Cipher 模式與該檔案一起發送給接受者;
接受端:這時接受者共得到兩樣東西,一個是所需要的檔案,另一個是已密碼編譯摘要資訊,接受端處理如下,
首先使用寄件者提供的公開金鑰對已加密的摘要資訊進行解密處理,還原摘要資訊的明碼格式;
然後對接受到的檔案像發送端那樣進行函數處理,將得到的摘要資訊與解密出來的摘要資訊進行比對。
如果比對結果相同,則說明接受的檔案是完整的;如果不同,說明檔案在傳輸的過程中可能被修改過或已感染病毒。
由上可以看出:數位簽章實際上是一個加密的過程;而數位簽章的驗證實際上是一個解密的過程。
數位簽章技術普遍應用於軟體下載站,論壇資料庫,系統檔案安全等方面,如:當我們下載某一軟體時,經常會在該軟體的描述資訊中找到其MD5值來用於下載後的校正過程,從而有效防止病毒。
MD5還普遍應用於作業系統或一般系統的登入認證上,如當我們開發使用人員管理系統時,探索資料庫表中所儲存的使用者密碼並不是使用者所輸入的原生態的密碼格式,而是經過MD5處理後的一段字串。當使用者登入的時候,系統把使用者輸入的密碼進行MD5 Hash運算,在和資料庫表中的md5值進行比較來確定輸入密碼是否正確。這樣便避免了普通使用者的密碼被具有系統管理員許可權的使用者查到,即使查資料庫,得到的也只是MD5處理後的資訊,而摘要資訊向源資訊的轉變是一個無法復原的過程。
工作應用:
前段時間一直在做銀行全國影像的項目,在央行與商業銀行影像互動的過程中,涉及到報文的編簽、核簽過程,其實也是數位簽章的使用過程,以此來確保報文資訊的完整性。
實用類:擷取某一位元組流的摘要資訊
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { public String getMD5(byte[] source){ String s=null; //用來將位元組轉換成16進位表示的字元 char[] hexDigits={'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f'}; try { MessageDigest md=MessageDigest.getInstance("MD5"); md.update(source); //MD5的計算結果是一個128位的長整數,用位元組表示為16個位元組 byte[] tmp=md.digest(); //每個位元組用16進位表示的話,使用2個字元(高4位一個,低4位一個),所以表示成16進位需要32個字元 char[] str=new char[16*2]; int k=0;//轉換結果中對應的字元位置 for(int i=0;i<16;i++){//對MD5的每一個位元組轉換成16進位字元 byte byte0=tmp[i]; str[k++]=hexDigits[byte0>>>4 & 0xf];//對位元組高4位進行16進位轉換 str[k++]=hexDigits[byte0 & 0xf]; //對位元組低4位進行16進位轉換 } s=new String(str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return s; } public static void main(String[] args) { MD5Util md5Util=new MD5Util(); String result=md5Util.getMD5("abc".getBytes()); System.out.println(result); } }