Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
import java.security.MessageDigest;
import java.util.Random;
/**
*
* @author Administrator
*/
public class CipherUtil {
//十六进制下数字到字符的映射数组
private final static String[] hexDigits = {"0", "1", "2", "3", "4",
"5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
/**
* * 把inputString加密
*/
public static String generatePassword(String inputString) {
return encodeByMD5(inputString);
}
/**
* 验证输入的密码是否正确
*
* @param password 加密后的密码
* @param inputString 输入的字符串
* @return 验证结果,TRUE:正确 FALSE:错误
*/
public static boolean validatePassword(String password, String inputString) {
if (password.equalsIgnoreCase(encodeByMD5(inputString))) {
return true;
} else {
return false;
}
}
/**
* 对字符串进行MD5加密
*/
private static String encodeByMD5(String originString) {
if (originString != null) {
try {
//创建具有指定算法名称的信息摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
byte[] results = md.digest(originString.getBytes());
//将得到的字节数组变成字符串返回
String resultString = byteArrayToHexString(results);
return resultString.toUpperCase();
} catch (Exception ex) {
ex.printStackTrace();
}
}
return null;
}
/**
* 转换字节数组为十六进制字符串
*
* @param 字节数组
* @return 十六进制字符串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
/**
* 将一个字节转化成十六进制形式的字符串
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
* 获取salt值
*
* @return
*/
public static String getSalt() {
Random random = new Random();
String SaltStr = "";
String s = null;
int num = 0;
while (num < 8) {
switch (random.nextInt(63)) {
case (0):
s = "0";
break;
case (1):
s = "1";
break;
case (2):
s = "2";
break;
case (3):
s = "3";
break;
case (4):
s = "4";
break;
case (5):
s = "5";
break;
case (6):
s = "6";
break;
case (7):
s = "7";
break;
case (8):
s = "8";
break;
case (9):
s = "9";
break;
case (10):
s = "a";
break;
case (11):
s = "b";
break;
case (12):
s = "c";
break;
case (13):
s = "d";
break;
case (14):
s = "e";
break;
case (15):
s = "f";
break;
case (16):
s = "g";
break;
case (17):
s = "h";
break;
case (18):
s = "i";
break;
case (19):
s = "j";
break;
case (20):
s = "k";
break;
case (21):
s = "m";
break;
case (23):
s = "n";
break;
case (24):
s = "o";
break;
case (25):
s = "p";
break;
case (26):
s = "q";
break;
case (27):
s = "r";
break;
case (28):
s = "s";
break;
case (29):
s = "t";
break;
case (30):
s = "u";
break;
case (31):
s = "v";
break;
case (32):
s = "w";
break;
case (33):
s = "l";
break;
case (34):
s = "x";
break;
case (35):
s = "y";
break;
case (36):
s = "z";
break;
case (37):
s = "A";
break;
case (38):
s = "B";
break;
case (39):
s = "C";
break;
case (40):
s = "D";
break;
case (41):
s = "E";
break;
case (42):
s = "F";
break;
case (43):
s = "G";
break;
case (44):
s = "H";
break;
case (45):
s = "I";
break;
case (46):
s = "L";
break;
case (47):
s = "J";
break;
case (48):
s = "K";
break;
case (49):
s = "M";
break;
case (50):
s = "N";
break;
case (51):
s = "O";
break;
case (52):
s = "P";
break;
case (53):
s = "Q";
break;
case (54):
s = "R";
break;
case (55):
s = "S";
break;
case (56):
s = "T";
break;
case (57):
s = "U";
break;
case (58):
s = "V";
break;
case (59):
s = "W";
break;
case (60):
s = "X";
break;
case (61):
s = "Y";
break;
case (62):
s = "Z";
break;
}
num++;
SaltStr = s + SaltStr;
}
return SaltStr;
}
public static void main(String[] args) {
System.out.println(CipherUtil.generatePassword("123")+"\t"+CipherUtil.getSalt());
}
}
MD5加密部分的代码还可以简化成
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[] strTemp = s.getBytes();
//使用MD5创建MessageDigest对象
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte b = md[i];
//System.out.println((int)b);
//将没个数(int)b进行双字节加密
str[k++] = hexDigits[b >> 4 & 0xf];
str[k++] = hexDigits[b & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}