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旧密码比对,如对则密码输入正确
相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔1 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区5 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说6 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json