加密技术(本例是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 demo() throws Exception{
MessageDigest md=MessageDigest.getInstance("MD5");//技术入口
String pwd="1357";
byte b1[]=pwd.getBytes();
byte b2[]=md.digest(b1);
/*至此,其实md5加密已经完成,可惜它生成的密文是字节数据,
* 然后我们通常要把它转成字符格式来看,此时直接转出来的字符有很多怪字符。
* 因此我们通常还需进一步转换成我们喜欢的格式--见demo2(),demo3()
*/
for(byte b:b2){
System.out.print((char)b+" ");
}
}
//用java提供的BASE64Encoder这个类帮我们把密文转换成我们喜欢的方式
@Test
public void demo2() throws Exception{
MessageDigest md=MessageDigest.getInstance("MD5");
String pwd="4321";
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="1111";
byte b1[]=pwd.getBytes();
byte[] b2 = md.digest( b1 );
System.out.println("len1:"+b2.length); //一定是16
//手动把每个字节转换成两个16进制数
String pwd2="";
for(byte b:b2){
String s=Integer.toHexString(b&0xff);
//为最终产生32位的密文,需要把只转成1位16进制数的密文补成2位
if(s.length()==1){
s=s+"b";
//s="0"+s;
//s = "a"+s; //具体怎么个补法,程序员可以自己随意变化,这就是变种
}
pwd2 +=s;
}
pwd2 = pwd2.toUpperCase();
System.out.println("len2:"+pwd2.length()); //32
System.out.println(pwd2);
}
生成加密后的密码工具类:
package cn.hncu.contact.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class PWDutils {
private PWDutils(){
}
/**
* 把明文pwd用MD5方式加密成密文返回
* @param pwd 要加密的明文
* @return 加密后生成的密文
*/
public static String mkPwd(String pwd){
String newPwd="";
try {
MessageDigest md=MessageDigest.getInstance("MD5");
byte b[]=md.digest(pwd.getBytes());
for(byte i: b){
String s=Integer.toHexString(i&0xff);
if(s.length()==1){
s="F"+s;
}
newPwd +=s;
}
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage(),e);
}
return newPwd;
}
}