用于对项目中密码生成MD5摘要和加盐的工具类

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

 

posted on 2018-06-06 13:10  大别山人  阅读(188)  评论(0编辑  收藏  举报