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这种复杂密码,就很难通过跑字典获取结果