使用JDK提供的MD5算法对字符串进行加密

      MD5算法虽然被破解,虽然国际上已经研究出MD5算法的后继者,但是MD5算法作为古老的Hash Function 它在现实的应用中是很常见的。众所周知,MD5算法将任意字节数组转化为长度为16的字节数组,那么如何将转化出的字节数组义字符串的形式存储在数据库中呢?以下是一个简单的方式

      JDK包装了MD5算法的实现,提供MessageDigest类来封装各种加密算法,并且该类的实际是单例的

首先我们可以通过MessageDigest.getInstance("MD5"),获取MD5算法的包装实例

                 MessageDigest messageDigest = MessageDigest.getInstance("MD5");

       然后将转化前的字符串转化为字节数组

                 byte [] bytes = str.getBytes();

      在通过算法实例的digest()方法,来处理字节数组

                byte [] targs = messageDigest .digest(bytes);//得到一个长度为16的字节数组

接下来处理字节数组转化为一个字符串,其处理的方法五花八门,怎么处理都不为过,这里介绍一个简单的方法:

一个字节byte 可由一个8位二进制表示其取值范围为-128-127

比如0 0 0 1 0 1 01 其可以由两个16进制数表示:0x15,这就是本方法的核心,将一个字节数拆分为两个16进制数,再进行拼接,设一个字节变量为b,获取其高4位数(表示为16进制):(b>>4)&0x0F—>其取值范围为0-15,但是要表示成0-F所以可以第一个字符数组

final char[] chars = new char[]'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

chars[(b>>4)&0x0F]就表示0-F的16进制数,低4位chars[b&0x0F],再用一个StringBuffer连接个字符就构成了一个32位字符串

可以将其写成一个方法就是

String md5(String str) {
		try {
			StringBuffer buffer = new StringBuffer();
			char[] chars = new char[]{'0','1','2','3',
					'4','5','6','7','8','9','A','B','C','D','E','F'};
			byte [] bytes = str.getBytes();
			MessageDigest messageDigest = MessageDigest.getInstance("MD5");
			byte[] targ = messageDigest.digest(bytes);
			for(byte b:targ) {
				buffer.append(chars[(b>>4)&0x0F]);
				buffer.append(chars[b&0x0F]);
			}
			return buffer.toString();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}


        关注微信公众号每天学习一点程序员的职业经



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值