需求:
登录和注册的密码涉及到网络安全,对密码的加密能够在一定程度上增加安全性,密码验证其实就是再次把密码明文和盐值再次重新组装进行加密,来判断加密后的结果是否匹配
完整代码
import org.apache.commons.codec.digest.DigestUtils;
import java.security.SecureRandom;
public class MD5Utils {
private static final String SALT_CHAR_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//盐包含的字符串
private static final SecureRandom RANDOM = new SecureRandom();//随机数生成器
/**
* 生成随机盐
* @param length 盐长度
* @return 盐文本
*/
public static String generateSalt(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int idx = RANDOM.nextInt(SALT_CHAR_POOL.length());
sb.append(SALT_CHAR_POOL.charAt(idx));
}
return sb.toString();
}
/**
* md5 加密
* @param password 密码明文
* @param salt 盐文本
* @return 加密后的文本
*/
public static String hashPassword(String password, String salt) {
String str = salt + password;
return DigestUtils.md5Hex(str);
}
/**
* 验证密码
* @param inputPassword 密码明文
* @param storedSalt 密码盐值
* @param storedHash 数据库里面保存的密码
* @return
*/
public static boolean verifyPassword(String inputPassword, String storedSalt, String storedHash) {
String newHash = hashPassword(inputPassword, storedSalt);
return newHash.equals(storedHash);
}
public static void main(String[] args) {
String password = "123456";
String salt = generateSalt(16); // 16字节随机盐
String hashed = hashPassword(password, salt);
System.out.println("随机盐: " + salt);
System.out.println("加密后的密码: " + hashed);
boolean isMatch = verifyPassword("123456", salt, hashed);
System.out.println("验证结果: " + isMatch);
}
}
微信扫码查看本文
发表评论