java通用的md5加密算法
import java.security.MessageDigest; public class MD5Util { public final static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) { System.out.println(MD5Util.MD5("20121221")); System.out.println(MD5Util.MD5("加密")); } }
下面的内容来至于http://hi.baidu.com/java2013/item/c5ec48d4e949e70cd90e44c7
1、使用了sun.misc.BASE64Encoder类来对密码进行MD5加密
import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class MD5DigestUtil { publicstatic String EncoderPwdByMd5(String password) throwsNoSuchAlgorithmException, UnsupportedEncodingException { // 确定计算方法 MessageDigestmd5 = MessageDigest.getInstance("MD5"); //这里使用sun的未公开的sun.misc.BASE64Encoder类 BASE64Encoder base64en = new BASE64Encoder(); // 加密后的字符串 // 说明:MD5加密后的字节数组,再使用base64对其进行编码 String newstr = base64en.encode(md5.digest(password.getBytes("utf-8"))); return newstr; } } import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; public class MD5Digest { publicstatic void main(String[] args) throws NoSuchAlgorithmException,UnsupportedEncodingException { String password = "1234"; System.out.println("加密前,password= " + password); String encodedPassword = MD5DigestUtil.EncoderPwdByMd5(password); System.out.println("加密后,password= " + encodedPassword); } }
这个类是sun未对外公开的类,在java API文档中,我们找不到这个类的说明文档。在Oracle的官方网站对这个类有说明,指出sun.*包中的类是sun内部使用的类,并不对外公开,在未来的版本中,也许会有变化,比如移到正式发行的包中,或者甚至有可能废弃不用,这都将给现在使用这个类的程序带来不稳定性。因此Oracle官方的建议是不要使用这个类,建议使用第三方提供的,比如Apache的类。
2 使用Apache的Base64编码类
Apache提供的有对字节数组进行Base64编码的类org.apache.commons.codec.binaryBase64。这个类提供有许多静态方法用来进行编码和解码。
在使用这个类之前,首先要到Apache官方网站上下载commons-codec-1.6.jar包,并将这个包导入到类的构建路径中。
下面是改写过后的MD5DigestUtil.java类的代码:
import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary; public class MD5DigestUtil { publicstatic String EncoderPwdByMd5(String password) throwsNoSuchAlgorithmException, UnsupportedEncodingException { // 确定计算方法 MessageDigest md5 = MessageDigest.getInstance("MD5"); // 加密后的字符串 // 说明:MD5加密后的字节数组,再使用base64对其进行编码 String newstr = Base64.encodeBase64String(md5.digest(password.getBytes("utf-8"))); return newstr; } }
3 使用Apache的DigestUtils加密算法类
Apache提供的有MD5、SHA等加密算法的类org.apache.commons.codec.digest.DigestUtils。这个类提供有许多静态方法用来进行加密。
在使用这个类之前,首先要到Apache官方网站上下载commons-codec-1.6.jar包,并将这个包导入到类的构建路径中。
下面是改写过后的使用org.apache.commons.codec.digest.DigestUtils类的MD5DigestUtil.java类的代码:
package com.xuejava; import org.apache.commons.codec.digest.DigestUtils; public class MD5DigestUtil { publicstatic String EncoderPwdByApacheMd5(String password){ return DigestUtils.md5Hex(password); } }