import java.security.MessageDigest; /** * 用于对项目中密码生成MD5摘要和加盐的工具类 * @author 彭锋 */ public final class MD5Util { private static final char[] hexadecimal = {‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘, ‘7‘,‘8‘,‘9‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘}; /** * 根据指定的字符串,返回对应的MD5摘要结果 * @param data 要生成摘要信息的字符串 * @return */ public static final String toMD5(String data) { if(data == null) { throw new NullPointerException("参数字符串不能为空!"); } try { MessageDigest digest = MessageDigest.getInstance("md5"); byte[] binaryData = digest.digest(data.getBytes("utf-8")); char[] buffer = new char[2*binaryData.length]; for (int i=0; i<binaryData.length; i++) { int low = binaryData[i] & 0x0f; int high = (binaryData[i] & 0xf0) >> 4; buffer[i*2] = hexadecimal[high]; buffer[i*2 + 1] = hexadecimal[low]; } return String.valueOf(buffer); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 根据参数返回加盐的md5摘要 * @param param * @return */ public static final String toMD5Salt(String param) { //获取参数字符串的一次MD5的结果 String md5 = toMD5(param); //将上面结果和参数字符串拼接后的hash码,作为盐 int hashCode = (param+md5).hashCode(); //将盐和第一次MD5的结果和参数字符串拼接起来,再次MD5运算 md5 = toMD5(hashCode+md5+param); //根据上面得到的哈希码的最低16位获取一个1到16的值 int i = (hashCode&0xF) + 1;//结果是1到16 //将第二次MD5的结果根据上面的结果重新排列 md5 = md5.substring(i, 16 + i) + md5.replace(md5.substring(i, 16 + i), ""); //返回重新排序的MD5 return md5; } }
原文地址:https://www.cnblogs.com/pf1988/p/9144578.html
时间: 2024-12-09 13:40:59