1. 程式人生 > >MD5加密演算法流程

MD5加密演算法流程

  MD5:Message-Digest Algorithm 5(資訊-摘要演算法),屬於雜湊雜湊演算法一類,對於MD5而言,有兩個特性是很重要的,
  第一:明文資料經過雜湊以後的值是定長的;
  第二:任意一段明文資料,經過雜湊以後,其結果必須永遠是不變的。
  前者的意思是可能存在有兩段明文雜湊以後得到相同長度的結果,後者的意思是如果我們雜湊特定的資料,得到的結果一定是相同的。
  MD5的作用是讓大容量資訊在用數字簽名軟體簽署私人金鑰前被”壓縮”成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的(32位)十六進位制數字串)。

  演算法原理:對MD5演算法簡要的敘述可以為:MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。
  在MD5演算法中,首先需要對資訊進行填充,使其位長對512求餘的結果等於448。因此,資訊的位長(Bits Length)將被擴充套件至N*512+448,N為一個非負整數,N可以是零。填充的方法如下,在資訊的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對資訊的填充。然後,在這個結果後面附加一個以64位二進位制表示的填充前資訊長度。經過這兩步的處理,資訊的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對資訊長度的要求。

  Java實現MD5過程
  1、通過單例的構造方法獲取MessageDigest例項,並指定加密演算法型別;
  2、將需要加密的字串加鹽後轉換成byte陣列後進行隨機雜湊過程;
  3、MessageDigest對位元組陣列進行摘要,得到摘要位元組陣列;
  4、迴圈遍歷生成的byte型別陣列,讓其生成32位字串,然後拼接字串得到MD5值;

  程式碼如下
  

public class MD5Util {

    /**
     * 對指定的字串進行MD5加密處理
     * @param password   待加密的原始密碼值
     * @return
MD5加鹽加密後的密碼值 */
public static String encodePassword(String password) { try { // 密碼加鹽處理,確保密碼更加安全 password = password + "neuyimi"; // 獲取MessageDigest例項,並指定加密演算法型別 MessageDigest digest = MessageDigest.getInstance("MD5"); // 將需要加密的字串轉換成byte陣列後進行隨機雜湊過程
byte[] byteArray = password.getBytes(); // 資訊摘要物件對位元組陣列進行摘要,得到摘要位元組陣列 byte[] md5Byte = digest.digest(byteArray); StringBuffer buffer = new StringBuffer(); // 迴圈遍歷byte型別陣列,讓其生成32位字串 for (byte b : md5Byte) { int i = b & 0xff; String str = Integer.toHexString(i); if (str.length() < 2) { str = "0" + str; } buffer.append(str); } return buffer.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } }

  :MD5是不可逆的,也就是沒有對應的演算法,把轉換後的MD5值逆向得到原始密碼資料;下面要說但是了,但是如果使用暴力破解,那也沒辦法,畢竟網上大神很多,保不齊大神用什麼方法就能逆向獲取到原始密碼;現在網上也有很多MD5解密工具,可以試試,簡單的MD5加密後的密碼還是可以解密的,但是如果加鹽以後,很多就破解不了啦!