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旧密码比对,如对则密码输入正确
相关推荐
ShineWinsu3 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
小付同学呀3 小时前
C语言学习(五)——输入/输出
c语言·开发语言·学习
码农阿豪3 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
梦幻精灵_cq4 小时前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
直有两条腿4 小时前
【大模型】Langchain4j
java·langchain
love530love4 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
消失的旧时光-19434 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
莫寒清4 小时前
ThreadLocal
java·面试
福大大架构师每日一题5 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
学习是生活的调味剂5 小时前
spring bean循环依赖问题分析
java·后端·spring