MD5在Java中的使用方法

/*
 * 加密技术(本例是MD5)主要是用到"java.security.MessageDigest"类
 * 我们写代码的基本套路:
 *  1)生成一个指定算法的加密工具md
 *    MessageDigest md = MessageDigest.getInstance("MD5");
 *  2)用md把明文b1(字节数据) 加密成 密文b2(字节数据)  ---无论明文有多长,密文一定是16个字节
 *    byte[] b2 = md.digest(b1)
 *  3)我们实际项目通常还要把密文b2再处理成我们喜欢的格式
 */@Test
    public void demo1() throws Exception{
        MessageDigest md = MessageDigest.getInstance("MD5");
        String pwd = "1234";
        byte b1[] = pwd.getBytes();
        byte[] b2 = md.digest( b1 );
        
        /*至此,其实md5加密已经完成,可惜它生成的密文是字节数据,
         * 然后我们通常要把它转成字符格式来看,此时直接转出来的字符有很多怪字符。
         * 因此我们通常还需进一步转换成我们喜欢的格式--见demo2(),demo3()
         */
        for(byte b: b2){
            System.out.print((char)b+" ");
        }
        System.out.println();
    }
    //用java提供的BASE64Encoder这个类帮我们把密文转换成我们喜欢的方式
    @Test
    public void demo2() throws Exception{
        MessageDigest md = MessageDigest.getInstance("MD5");
        String pwd = "1234";
        byte b1[] = pwd.getBytes();
        byte[] b2 = md.digest( b1 );
        
        BASE64Encoder en = new BASE64Encoder();
        String pwd2 = en.encode(b2);
        System.out.println(pwd2);
    }
    /*上面的方式跟我们以后开发的需求相比,经常还会出现两个不足
      1) BASE64Encoder类在API中不存在,
               意味着java是没有公开这个类的,
               有一天它修改甚至删除,我们是没说的,
               因此这个类使用起来不保险!
      2) 用该方式转换出来的字符串并非全是16进制的数,如有"="等字符,很多软件不喜欢这种方式
    */
    
    //这种方式通常是程序员最喜欢的: 1)字符全是16进制的数  2)自己还可稍变种一下
    @Test
    public void demo3() throws Exception{
        MessageDigest md = MessageDigest.getInstance("MD5");
        String pwd = "";
        byte b1[] = pwd.getBytes();
        byte[] b2 = md.digest( b1 );
        System.out.println("len1:"+b2.length); //一定是16
        
        //手动把每个字节转换成两个16进制数
        String pwd2="";
        for(byte i:b2){
            String s = Integer.toHexString(i&0xff);
            //为最终产生32位的密文,需要把只转成1位16进制数的密文补成2位
            if(s.length()==1){
                //s="0"+s;
                s = "a"+s; //具体怎么个补法,程序员可以自己随意变化,这就是变种
            }
            pwd2 +=s;
        }
        pwd2 = pwd2.toUpperCase();
        System.out.println("len2:"+pwd2.length()); //32
        System.out.println(pwd2);
    }
    

你可能感兴趣的:(Java)