java中MD5加密
MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不"知道"用户的密码是什么。
一些黑客破获这种密码的方法是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。
public class Md5Test {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = "aaabbb";
String s3 = "aaabbbccc";
String s4 = "aaabbbccc";
String s5 = "aaabbbccc";
String s6 = "aaa@#Q!3";
String res1 = DigestUtils.md5DigestAsHex(s1.getBytes());
String res2 = DigestUtils.md5DigestAsHex(s2.getBytes());
String res3 = DigestUtils.md5DigestAsHex(s3.getBytes());
String res4 = DigestUtils.md5DigestAsHex(s4.getBytes());
byte[] res5 = DigestUtils.md5Digest(s5.getBytes());
String res6 = DigestUtils.md5DigestAsHex(s6.getBytes());
System.out.println("res1:"+res1);
System.out.println("res2:"+res2);
System.out.println("res3:"+res3);
System.out.println("res4:"+res4);
System.out.println("res5:"+res5.toString());
System.out.println("res6:"+res6);
}
}
res1:47bce5c74f589f4867dbd57e9ca9f808
res2:6547436690a26a399603a7096e876a2d
res3:d1aaf4767a3c10a473407a4e47b02da6
res4:d1aaf4767a3c10a473407a4e47b02da6
res5:[B@10f87f48
res6:acb2e97d976f32b58caf093d42900792
对于res1,res2,res3解密网站很容易通过跑字典的形式获得结果,但是对于res6这种复杂密码,就很难通过跑字典获取结果