有沒有發(fā)現(xiàn)MD5 加密之后的長度是一樣的肴裙,不管原本的信息有多長炼幔。這是因?yàn)?MD5 是摘要算法墓猎,有點(diǎn)類似于從你要加密的信息中選取一部分信息出來加密卷胯,所以即使你得到了 MD5 加密之后的結(jié)果,也很難從一部分信息中反推出原本的完整信息辜贵。另外悯蝉,MD5 也是存在被破解的情況,那就是最傳統(tǒng)的破解方法托慨,從一堆數(shù)據(jù)中一個(gè)個(gè)去試鼻由。所以, MD5 可以設(shè)置一個(gè)鹽值厚棵,類似于干擾信息蕉世,可以降低被破解的概率。
jdk提供的MD5加密
package com.jun.MD;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class JDKmd5 {
private static String src="ysj";
public static void main(String[] args) throws NoSuchAlgorithmException {
jdkMD5();
}
public static void jdkMD5() throws NoSuchAlgorithmException {
//獲取實(shí)例婆硬,執(zhí)行準(zhǔn)換
MessageDigest md= MessageDigest.getInstance("MD5");
byte[] digest = md.digest(src.getBytes());
//將byte[] 轉(zhuǎn)換成16進(jìn)制輸出
System.out.println(bytes2hex(digest));
}
//將字節(jié)數(shù)組轉(zhuǎn)換成16進(jìn)制方法
public static String bytes2hex(byte[] bytes)
{
final String HEX = "0123456789abcdef";
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes)
{
// 取出這個(gè)字節(jié)的高4位狠轻,然后與0x0f與運(yùn)算,得到一個(gè)0-15之間的數(shù)據(jù)彬犯,通過HEX.charAt(0-15)即為16進(jìn)制數(shù)
sb.append(HEX.charAt((b >> 4) & 0x0f));
// 取出這個(gè)字節(jié)的低位哈误,與0x0f與運(yùn)算,得到一個(gè)0-15之間的數(shù)據(jù)躏嚎,通過HEX.charAt(0-15)即為16進(jìn)制數(shù)
sb.append(HEX.charAt(b & 0x0f));
}
return sb.toString();
}
}
//結(jié)果
805309b2a84c9550d62718f314d7b2ff
常見情況將密碼進(jìn)行加密存儲(chǔ)到數(shù)據(jù)庫蜜自,來保證密碼安全。