/*
* 加密技术(本例是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);
}
MD5在Java中的使用方法
猜你喜欢
转载自blog.csdn.net/qq_35307947/article/details/82015582
今日推荐
周排行