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 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;
	}
}

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/82021701