第一种apache方法适用固定16进制的MD5加密
第二种JDK方法适用可设置进制长度的MD5加密
第三种依旧是apache的方法,性能好,对原串拼接字符串加密再拼接再加密,2次MD5加密,是为了更好的增加密文的安全性(为什么不随机字符串随机数字串呢,是因为考虑到后续原串与数据库储存的密文可以对比)。
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.coyote.http2.ByteUtil;
import org.springframework.util.DigestUtils;
import com.mchange.lang.ByteUtils;
/**
* @author 王小东
* @date 2020年7月10日 上午10:57:23
* @version 1.0
*/
public class MD5 {
/**
* apache的工具类DigestUtils来进行加密
* @param str
* @return
*/
public static String getMd5(String str) {
return DigestUtils.md5DigestAsHex(str.getBytes());
}
/**
* 使用JDK自带的MessageDigest类
* @param str
* @return
*/
public static String getMd5JDK(String str) {
String md5Str = "";
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
byte[] digest = md5.digest(str.getBytes());
md5Str = new BigInteger(1,digest).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5Str;
}
/**
* 有前缀和后缀并且二次md5加密
* @param str
* @return
*/
public static String getTwoMD5(String str) {
//对原串拼接前缀
str = "o2o" + str;
//md5加密 16进制
str = DigestUtils.md5DigestAsHex(str.getBytes());
//对加密后的密文再次拼接后缀
str = str + "richwit";
//md5二次加密
str = DigestUtils.md5DigestAsHex(str.getBytes());
return str;
}
public static void main(String[] args) {
System.out.println("getMd5(\"123456\"):" + getMd5("123456"));
System.out.println("getMd5JDK(\"123456\"):"+getMd5JDK("123456"));
System.out.println("getTwoMD5(\"123456\"):"+getTwoMD5("123456"));
}
}
结果:
getMd5(“123456”): e10adc3949ba59abbe56e057f20f883e
getMd5JDK(“123456”):e10adc3949ba59abbe56e057f20f883e
getTwoMD5(“123456”):10a3f717dac31b48ed074d591fce17ba