md5加密原理
首先要明白一個概念,md5不是用於加密,而是用於資料的完整性校正的一種技術。
這是一個單向散列函數,單向的意思就是說無法復原轉。你可以將源內容通過md5函數散列出一個md5校正碼,這個md5校正碼是唯一的,你可以作為證明源的身份標識,但是你無法通過md5校正碼去還原源。
Src ---> md5 --->md5Code
但是 md5Code --->某演算法 ---> Src 是不可能的
同樣的內容經過md5演算法總是得到相同的md5校正碼。
之所以給人以md5是用於加密的這種假象,是因為該技術應用於很多密碼校正和檔案完整性校正過程中。
如你的password用明文輸入,經過md5以後形成一個32位元組的 md5校正碼,儲存在伺服器上。伺服器的管理員可以看到你的32位元組的md5校正碼,但是因為沒有辦法通過md5校正碼還原成原密碼,因此該密碼的儲存(實際上是儲存的密碼的一個唯一標識)是安全的。
校正的時候,你輸入你的密碼,經過md5以後形成一個新的32位元組的md5校正碼,伺服器比較新的校正碼和舊的校正碼就可以判斷你是否輸入了正確的密碼。在整個認證和鑒權的過程中,伺服器只和你的密碼產生以後的md5校正碼打交道,而避免了和密碼直接打交道。
其次用得非常多的是檔案的完整性校正。
我們都經常從FTP網站上下載檔案,在Internet不可信任的環境中,存在很多的不安全因素。如果你下載的session被人截獲,並在下載的檔案中插入危險代碼,使得當你下載完畢運行程式的時候植入木馬或者病毒或者其他非安全的代碼。要驗證檔案的完整性,FTP server一般將整個檔案夾打成包,如iso檔案,然後同時給出md5校正碼。當你下在該iso檔案,在刻盤之前,運行md5程式產生一個md5校正碼,如果和FTP Server上的校正碼一樣,就可以證明:在檔案傳輸的過程中沒有產生錯誤和任何修改。如果你信賴該FTP
Server,那麼你就可以放心使用該檔案或資源。
範例: Java代碼
-
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
-
- public class md5 {
- public String str;
-
- public void md5s(String plainText) {
- try {
- MessageDigest md = MessageDigest.getInstance("MD5");
- md.update(plainText.getBytes());
- byte b[] = md.digest();
-
- int i;
-
- StringBuffer buf = new StringBuffer("");
- for (int offset = 0; offset < b.length; offset++) {
- i = b[offset];
- if (i < 0)
- i += 256;
- if (i < 16)
- buf.append("0");
- buf.append(Integer.toHexString(i));
- }
- str = buf.toString();
- System.out.println("result: " + buf.toString());// 32位的加密
- System.out.println("result: " + buf.toString().substring(8, 24));// 16位的加密
- } catch (NoSuchAlgorithmException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
-
- }
- }
-
- public static void main(String agrs[]) {
- md5 md51 = new md5();
- md51.md5s("4");//加密4
- }
-
- }