java对字符串密码的MD5加密与验证
MD5 即Message-Digest Algorithm 5(信息-摘要 算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译 摘要算法 、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
本实例介绍用MD5进行加密和验证,将输入字符串通过MD5加密成另一个字符串,而且根据新的字符串无法获得原字符串,但可以在不知道原始密码的情况下进行密码验证。
关键技术:
*通过Java.security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入“MD5”则表示将使用MD5算法。
*MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回存放哈希值结果的季节数组,这个数组就是MD5加密产品。
*将加密后的字节数组转换成十六进制的字符窜,形成最终的密码。
*当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。
实例演示:
/** 对字符串进行MD5加密 */
public class MD5Util {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
* 转换字节数组为16进制字串
*
* @param b
* 字节数组
* @return 16进制字串
*/
public 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];
}
/** 对字符串进行MD5加密 */
public static String MD5Encode(String origin) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
} catch (Exception ex) {
}
return resultString;
}
/**
* 验证前端输入的密码是否正确,input为前端输入的密码字符串,password为数据库读取的密码
*
* @param b
* 字节数组
* @return 16进制字串
*/
public static boolean isValidate(String input,String password){
boolean status = false;
if(MD5Util.MD5Encode(input).equals(password)){
status = true;
}else{
status = false;
}
return status;
}
/** 主方法测试 */
public static void main(String[] args) {
System.out.println(MD5Encode("123"));
boolean b = MD5Util.isValidate("123", "21232f297a57a5a743894a0e4a801fc3");
System.out.println(b);
}
}
public class MD5Util {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
* 转换字节数组为16进制字串
*
* @param b
* 字节数组
* @return 16进制字串
*/
public 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];
}
/** 对字符串进行MD5加密 */
public static String MD5Encode(String origin) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
} catch (Exception ex) {
}
return resultString;
}
/**
* 验证前端输入的密码是否正确,input为前端输入的密码字符串,password为数据库读取的密码
*
* @param b
* 字节数组
* @return 16进制字串
*/
public static boolean isValidate(String input,String password){
boolean status = false;
if(MD5Util.MD5Encode(input).equals(password)){
status = true;
}else{
status = false;
}
return status;
}
/** 主方法测试 */
public static void main(String[] args) {
System.out.println(MD5Encode("123"));
boolean b = MD5Util.isValidate("123", "21232f297a57a5a743894a0e4a801fc3");
System.out.println(b);
}
}