文章目录
MD5加盐值-注册与登录
1. 创建的java非maven项目,引用两个jar包
复制代码
<!-- mysql驱动连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Apache Commons Codec(用于 MD5 和 Base64) -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
2. 数据库表语句
复制代码
CREATE DATABASE IF NOT EXISTS user_db;
USE user_db;
-- 数据库表结构
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(128) NOT NULL, -- 存储 MD5(明文 + salt) 的结果(32位 hex)
salt VARCHAR(64) NOT NULL -- 存储生成的 salt(如 32 字符 hex)
);
2. JAVA工具类:MD5加盐加密工具
复制代码
import org.apache.commons.codec.digest.DigestUtils;
import java.security.SecureRandom;
public class PasswordUtil {
private static final SecureRandom random = new SecureRandom();
// 生成随机盐值(32 字符 hex)
public static String generateSalt() {
byte[] salt = new byte[16]; // 16 字节 = 128 位
random.nextBytes(salt);
return DigestUtils.md5Hex(salt); // 转为 32 字符 hex
}
// 对明文密码 + 盐值进行 MD5 加密
public static String hashPassword(String password, String salt) {
String combined = password + salt;
return DigestUtils.md5Hex(combined);
}
// 验证密码是否正确
public static boolean verifyPassword(String inputPassword, String storedHash, String salt) {
String inputHash = hashPassword(inputPassword, salt);
return inputHash.equals(storedHash);
}
}
3.Java主程序:注册用户+登录验证
复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class LoginSystem {
private static final String URL = "jdbc:mysql://localhost:3306/mytest?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "wei@"; // 替换为你的 MySQL 密码
public static void main(String[] args) {
try {
// 1. 注册用户(第一次运行时执行)
registerUser("alice", "123456");
// 2. 登录验证(模拟登录)
boolean loginSuccess = login("alice", "123456");
System.out.println("登录结果: " + (loginSuccess ? "成功" : "失败"));
} catch (Exception e) {
e.printStackTrace();
}
}
// 注册用户:将明文密码加盐后存入数据库
public static void registerUser(String username, String plainPassword) throws SQLException {
String sql = "INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement ps = conn.prepareStatement(sql)) {
String salt = PasswordUtil.generateSalt();
String passwordHash = PasswordUtil.hashPassword(plainPassword, salt);
ps.setString(1, username);
ps.setString(2, passwordHash);
ps.setString(3, salt);
int rows = ps.executeUpdate();
if (rows > 0) {
System.out.println("用户 " + username + " 注册成功!");
}
}
}
// 登录验证:输入明文密码,与数据库中存储的比对
public static boolean login(String username, String plainPassword) throws SQLException {
String sql = "SELECT password_hash, salt FROM users WHERE username = ?";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
String storedHash = rs.getString("password_hash");
String salt = rs.getString("salt");
boolean isValid = PasswordUtil.verifyPassword(plainPassword, storedHash, salt);
return isValid;
} else {
System.out.println("用户不存在!");
return false;
}
}
}
}
总结:
复制代码
1.运行完感悟,将首次注册账号时候的盐值经过MD5加密后字段(salt)存储到数据库, 注册的密码为明文密码经过MD5加密 + salt (MD5加密后的)组合成新的MD5密码值,存储到数据库password_hash这个字段中,完成首次登录的生成的密码。
2.登录如何验证的,登录根据用户名查询到用户存储过的MD5后盐值,将输入的明文密码经过MD5加密后+查询到的盐值拼接一起,进行组合后MD5加密; 将这个生成后MD5密码 与数据库存储的password_hash这个MD5旧密码比对,如对则密码输入正确