【MD5加密】用java.security.MessageDigest(md5)对信息加密

(一)用MessageDigest类对信息加密(已经加密,但密文显示方式未处理):

md5加密核心代码:

//md5加密核心代码
MessageDigest md=MessageDigest.getInstance("MD5");
String pwd="1234";
byte[] b1=pwd.getBytes();
byte[] b2=md.digest(b1);//利用md对象把 明文b1[] 加密成密文b2[]

通过字节数组显示密文:

//至此,MD5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常看的懂得字节数据,因此还要进一步处理。

//注意:用MD5加密后的所变成的字节数组是16位的
System.out.println("b.len="+b2.length);
for(int i=0;i<b2.length;i++){
    System.out.print(b2[i]+" ");//-127 -36 -101 -37 82 -48 77 -62 0 54 -37 -40 49 62 -48 85 
}

通过字符显示密文:

//将密文字节数组转换为字符串也是看不懂的
System.out.println();
for(int i=0;i<b2.length;i++){
    System.out.print((char)(b2[i])+" ");//チ ᅵ ロ ᅴ R ￐ M ᅡ 
}

(二)用MessageDigest类对信息加密(与前面相比,怪字符少一些,但还不是16进制):

MessageDigest md=MessageDigest.getInstance("MD5");
String pwd="1234";
byte[] b1=pwd.getBytes();
byte[] b2=md.digest(b1);

注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的:

//注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的
BASE64Encoder en=new BASE64Encoder();
String pwd2 =en.encode(b2);
System.out.println(pwd2);
//结果:gdyb21LQTcIANtvYMT7QVQ==
/*
 * demo2()方法的缺点:
 * 1、密文不是我们最习惯的16进制
 * 2、所使用的类在BASE64Encoder在API中是没有的,意味该类是没有公开的,
 *    给我们程序员用的,因此他如果便动了,我们没办法,不稳定。
 * ----不在接口中,官方是可以随便改的。
 */

(三)用MessageDigest类对信息加密(我们手动写代码,把md5生成的密文转换成16进制):

@Test
    public void demo3() throws NoSuchAlgorithmException{
        MessageDigest md=MessageDigest.getInstance("MD5");
        String pwd="1234";
        byte[] b1=pwd.getBytes();
        byte[] b2=md.digest(b1);//密文b2[] 

        /*
        for(int i=0;i<b2.length;i++){
            String sh=Integer.toHexString(b2[i]);
            System.out.print(sh+" ");
        }
        输出结果:ffffff81 ffffffdc ffffff9b ffffffdb 52 ffffffd0 4d ffffffc2 0 36 ffffffdb ffffffd8 31 3e ffffffd0 55 
        我们看到,16个字节转换成了16个16进制数,这样总共有16*16位,密文 太长,如果转换成32位就好了。
        */

        //我们字节转换为16进制
        String pwd2="";
        for(byte i: b2){
            String s = Integer.toHexString(i & 0xff); //如果i<16则s只有一位,只有>=16的i转换成的s才是两位
            if(s.length()==1){
                s ="0"+s; // s ="f"+s;
            }
            pwd2 +=s;
        }
        pwd2 = pwd2.toUpperCase();
        System.out.println(pwd2.length());
        System.out.println(pwd2);//最后的MD5结果:81DC9BDB52D04DC20036DBD8313ED055
    }

完整代码示例:

package teachDemo;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.junit.Test;

import Decoder.BASE64Encoder;
public class Md5Demo {
    /**
     * 加密算法类:java.security.MessageDigest
     */
    @Test
    public void demo1() throws NoSuchAlgorithmException{
        //md5加密核心代码
        MessageDigest md=MessageDigest.getInstance("MD5");
        String pwd="1234";
        byte[] b1=pwd.getBytes();
        byte[] b2=md.digest(b1);//利用md对象把 明文b1[] 加密成密文b2[]

        //至此,MD5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常看的懂得字节数据,因此还要进一步处理。

        //注意:用MD5加密后的所变成的字节数组是16位的
        System.out.println("b.len="+b2.length);
        for(int i=0;i<b2.length;i++){
            System.out.print(b2[i]+" ");//-127 -36 -101 -37 82 -48 77 -62 0 54 -37 -40 49 62 -48 85 
        }

        //将密文字节数组转换为字符串也是看不懂的
        System.out.println();
        for(int i=0;i<b2.length;i++){
            System.out.print((char)(b2[i])+" ");//チ ᅵ ロ ᅴ R ￐ M ᅡ 
        }
    }

    /**
     * 把md5生成的密文转换成我们习惯的方式---与前面相比,怪字符少一些,但还不是16进制
     */
    @Test
    public void demo2() throws NoSuchAlgorithmException{
        MessageDigest md=MessageDigest.getInstance("MD5");
        String pwd="1234";
        byte[] b1=pwd.getBytes();
        byte[] b2=md.digest(b1);
        //注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的
        BASE64Encoder en=new BASE64Encoder();
        String pwd2 =en.encode(b2);
        System.out.println(pwd2);//结果:gdyb21LQTcIANtvYMT7QVQ==

        /*
         * demo2()方法的缺点:
         * 1、密文不是我们最习惯的16进制
         * 2、所使用的类在BASE64Encoder在API中是没有的,意味该类是没有公开的,
         *    给我们程序员用的,因此他如果便动了,我们没办法,不稳定。
         * ----不在接口中,官方是可以随便改的。
         */
    }

    /**
     * 我们手动写代码,把md5生成的密文转换成16进制
     * @throws NoSuchAlgorithmException 
     */
    @Test
    public void demo3() throws NoSuchAlgorithmException{
        MessageDigest md=MessageDigest.getInstance("MD5");
        String pwd="1234";
        byte[] b1=pwd.getBytes();
        byte[] b2=md.digest(b1);//密文b2[] 

        /*
        for(int i=0;i<b2.length;i++){
            String sh=Integer.toHexString(b2[i]);
            System.out.print(sh+" ");
        }
        输出结果:ffffff81 ffffffdc ffffff9b ffffffdb 52 ffffffd0 4d ffffffc2 0 36 ffffffdb ffffffd8 31 3e ffffffd0 55 
        我们看到,16个字节转换成了16个16进制数,这样总共有16*16位,密文 太长,如果转换成32位就好了。
        */

        //我们字节转换为16进制
        String pwd2="";
        for(byte i: b2){
            String s = Integer.toHexString(i & 0xff); //如果i<16则s只有一位,只有>=16的i转换成的s才是两位
            if(s.length()==1){
                s ="0"+s; // s ="f"+s;
            }
            pwd2 +=s;
        }
        pwd2 = pwd2.toUpperCase();
        System.out.println(pwd2.length());
        System.out.println(pwd2);//最后的MD5结果:81DC9BDB52D04DC20036DBD8313ED055
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值