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