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旧密码比对,如对则密码输入正确
相关推荐
myloveasuka1 分钟前
Java与C++多态访问成员变量/方法 对比
java·开发语言·c++
2301_8217005312 分钟前
C++编译期多态实现
开发语言·c++·算法
Andya_net18 分钟前
Spring | @EventListener事件机制深度解析
java·后端·spring
奥地利落榜美术生灬23 分钟前
c++ 锁相关(mutex 等)
开发语言·c++
xixihaha132429 分钟前
C++与FPGA协同设计
开发语言·c++·算法
lang2015092831 分钟前
18 Byte Buddy 进阶指南:解锁 `@Pipe` 注解,实现灵活的方法转发
java·byte buddy
重庆小透明33 分钟前
【java基础篇】详解BigDecimal
java·开发语言
ID_1800790547339 分钟前
模拟1688商品详情的Python API实现,返回符合风格的JSON数据
开发语言·python·json
小小怪7501 小时前
C++中的函数式编程
开发语言·c++·算法
金山几座1 小时前
C#学习记录-事件
开发语言·学习·c#