目录
java内置的哈希MD5加密算法:
MD5加密
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(8*16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
(一)
public class MD5util {
public static String getMD5(String password) throws NoSuchAlgorithmException {
//md5加密
StringBuffer sb = new StringBuffer(32);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(password.getBytes());
for (int i = 0; i < array.length; i++) {
sb.append(Integer.toHexString((array[i] ) & 0xFF | 0x100).toUpperCase(), 1, 3);
}
return sb.toString();
}
}
(二)
工具类:
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
public class MD5Util {
/**
* 加密,不可逆
* @param password 需要加密的秘密
* @return /
*/
public static String encode(String password){
if (Objects.nonNull(password)) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
// 生成 8位 的数字的数组,数组中有 16 个数
byte[] digest = md5.digest(password.getBytes(StandardCharsets.UTF_8));
// 将 16 个 8 位数组成一个 BigInteger 正整数,并转成 16 进制字符串输出
return new BigInteger(1, digest).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 校验密码是否正确
* @param password 输入的原始秘密
* @param digest 存起来的加密后秘闻
* @return /
*/
public static boolean validate(String password, String digest){
if (Objects.nonNull(password) && Objects.nonNull(digest)) {
return Objects.equals(encode(password), digest);
}
return false;
}
}
加密
public static void main(String[] args) {
String encode = MD5Util.encode("123456");
System.out.println(encode);
// 输出:e10adc3949ba59abbe56e057f20f883e
}
校验密码
if (MD5Util.validate("123456", "e10adc3949ba59abbe56e057f20f883e") {
resp.sendRedirect("/index");
} else {
writer.write("用户名或者密码错误,<a href='/login.html'>返回登录页</a>");
}