MD5加盐值-注册与登录

文章目录

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旧密码比对,如对则密码输入正确
相关推荐
Traced back2 小时前
# C# WinForms 数据库清理系统基础知识与避坑指南
开发语言·数据库·c#
东东5162 小时前
校园求职招聘系统设计和实现 springboot +vue
java·vue.js·spring boot·求职招聘·毕设
茉莉玫瑰花茶2 小时前
C++ 17 详细特性解析(4)
开发语言·c++·算法
Cult Of2 小时前
锁正确使用
java
rosmis2 小时前
地铁病害检测系统软件改进记录-2-02
开发语言·前端·javascript
long3162 小时前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
欧阳x天2 小时前
STL详解(九)—— stack和queue的模拟实现
开发语言·c++
xqqxqxxq2 小时前
洛谷算法1-1 模拟与高精度(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
MengFly_2 小时前
Compose 脚手架 Scaffold 完全指南
android·java·数据库