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加密後的密碼還是可以解密的,但是如果加鹽以後,很多就破解不了啦!