使用自制工具类实现安全的密码加密与校验

devtools/2025/2/27 15:48:09/

在现代应用中,密码的安全性至关重要。为了保护用户密码,我们通常会对密码进行加密存储,并在用户登录时进行校验。本文将介绍如何使用 PasswordEncryptionUtil 工具类实现密码的加密与校验。


工具类介绍

PasswordEncryptionUtil 是一个基于 BCrypt 算法的密码加密工具类,提供了以下两个核心方法:

  1. encodePassword(String rawPassword)
    用于对原始密码进行加密,返回加密后的字符串。

  2. matches(String rawPassword, String encodedPassword)
    用于校验原始密码是否与加密后的密码匹配,返回布尔值。


为什么选择 BCrypt?

BCrypt 是一种广泛使用的密码哈希算法,具有以下优点:

  1. 安全性高BCrypt 使用盐值(salt)和多次哈希迭代,有效抵御彩虹表攻击。
  2. 自动盐值管理BCrypt 在加密时会自动生成盐值,并将其嵌入到加密结果中,无需额外存储。
  3. 可配置的复杂度:通过调整哈希迭代次数,可以控制加密的复杂度。

使用步骤

1. 添加依赖

首先,确保项目中引入了 jBCrypt 依赖。如果使用 Maven,可以在 pom.xml 中添加以下依赖:

<dependency><groupId>org.mindrot</groupId><artifactId>jbcrypt</artifactId><version>0.4</version>
</dependency>

2. 加密密码

在用户注册或修改密码时,使用 encodePassword 方法对密码进行加密:

String rawPassword = "user123"; // 用户输入的原始密码
String encodedPassword = PasswordEncryptionUtil.encodePassword(rawPassword);
System.out.println("加密后的密码: " + encodedPassword);

输出示例

加密后的密码: $2a$10$3zYbJZ5Z5Z5Z5Z5Z5Z5Z5u

3. 校验密码

在用户登录时,使用 matches 方法校验密码是否匹配:

String rawPassword = "user123"; // 用户输入的原始密码
String encodedPassword = "$2a$10$3zYbJZ5Z5Z5Z5Z5Z5Z5Z5u"; // 数据库中存储的加密密码boolean isMatch = PasswordEncryptionUtil.matches(rawPassword, encodedPassword);
System.out.println("密码是否匹配: " + isMatch);

输出示例

密码是否匹配: true

实际应用场景

场景 1:用户注册

在用户注册时,对密码进行加密并存储到数据库:

public void registerUser(String username, String rawPassword) {String encodedPassword = PasswordEncryptionUtil.encodePassword(rawPassword);// 将 username 和 encodedPassword 存储到数据库userRepository.save(new User(username, encodedPassword));
}

场景 2:用户登录

在用户登录时,校验密码是否匹配:

public boolean loginUser(String username, String rawPassword) {User user = userRepository.findByUsername(username);if (user == null) {return false; // 用户不存在}return PasswordEncryptionUtil.matches(rawPassword, user.getEncodedPassword());
}

场景 3:修改密码

在用户修改密码时,对新密码进行加密并更新数据库:

public void changePassword(String username, String newRawPassword) {String newEncodedPassword = PasswordEncryptionUtil.encodePassword(newRawPassword);// 更新数据库中的密码userRepository.updatePassword(username, newEncodedPassword);
}

注意事项

  1. 密码强度
    在加密前,建议对原始密码进行强度校验,确保密码符合安全要求(如长度、复杂度等)。

  2. 加密结果长度
    BCrypt 的加密结果长度固定为 60 个字符,数据库字段应预留足够空间。

  3. 性能优化
    BCrypt 的哈希迭代次数可以通过 BCrypt.gensalt(int log_rounds) 调整,默认值为 10。较高的迭代次数会增加安全性,但也会增加计算时间。

  4. 错误处理
    在实际应用中,应对加密和校验过程中的异常进行捕获和处理,例如:

    try {String encodedPassword = PasswordEncryptionUtil.encodePassword(rawPassword);
    } catch (Exception e) {// 处理加密失败的情况
    }
    

总结

PasswordEncryptionUtil 工具类基于 BCrypt 算法,提供了简单易用的密码加密与校验功能。通过本文的介绍,您可以在项目中轻松实现密码的安全管理,有效保护用户数据。希望这篇博客对您有所帮助!如果有任何问题,欢迎留言讨论。


附录:完整工具类代码

package com.paoxiaomo.teachingassistant.utils;import org.mindrot.jbcrypt.BCrypt;public class PasswordEncryptionUtil {/*** 加密密码** @param rawPassword 原始密码* @return 加密后的密码*/public static String encodePassword(String rawPassword) {// 生成盐值并加密密码return BCrypt.hashpw(rawPassword, BCrypt.gensalt());}/*** 校验密码是否匹配** @param rawPassword      原始密码* @param encodedPassword  加密后的密码* @return 校验结果,true 为匹配,false 为不匹配*/public static boolean matches(String rawPassword, String encodedPassword) {// 校验原始密码和加密后的密码是否匹配return BCrypt.checkpw(rawPassword, encodedPassword);}
}

http://www.ppmy.cn/devtools/163099.html

相关文章

Origin 2024绘图与数据分析下载|附安装包+学习教程

如大家所了解的&#xff0c;Origin是一款图形可视化和数据分析软件&#xff0c;它是为初学者提供了使用的界面&#xff0c;并且随着用户对应用程序的日益熟还可以执行高等自定义。软件具有大量2D和3D绘图模板。 Origin主要应用&#xff1a; 绘图 凭借100多种内置和扩展的图表…

2025年第16届蓝桥杯嵌入式竞赛学习笔记(十):ADC测量电压

1.原理图 VDD的最大值为3.3V&#xff0c;所以PB15测量电压值的范围为0~3.3V&#xff0c;然后它读取到的AD值为0~4096&#xff0c;所以电压测量公式为 为什么是4096&#xff0c;因为ADC是一个12比特的 2.CubeMX配置 将PB15引脚配置为ADC2_IN15&#xff0c;PB12配置为ADC1_IN11 …

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(四)

控制面板自我刷新 (PSR) ADS 功能使用 PSR 来避免切换过程中出现故障。 具体来说&#xff0c;使用 PSR1&#xff08;全屏更新模式&#xff09;时&#xff0c;GPU0 和 GPU1 无需协商使用哪种 PSR 模式。 即使在 PSR1 中&#xff0c;面板也需要支持以下的可选功能&#xff1a; …

设计模式教程:模板方法模式(Template Method Pattern)

一、概述 模板方法模式&#xff08;Template Method Pattern&#xff09; 是一种行为型设计模式&#xff0c;旨在定义一个操作中的算法骨架&#xff0c;而将一些步骤的具体实现延迟到子类中。通过模板方法模式&#xff0c;父类可以不改变算法结构的情况下&#xff0c;让子类重…

Java【网络原理】(1)初识网络

目录 1.前言 2.正文 2.1基础知识 2.2协议分层&#xff08;tcp/ip五层网络模型&#xff09; 2.3网络数据通信的基本流程 2.3.1数据发送过程 2.3.2数据接收过程 3.小结 1.前言 断更又是许久&#xff0c;再次回归又是一个新的开始&#xff0c;希望我们都能继加油。今天来…

【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记

本文首先介绍了抽象数据类型与树的概念&#xff0c;接着重点讲解二叉搜索树的定义与操作方式&#xff0c;并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型&#xff08;Abstract Data Type&#xff0c;ADT&#xff09;&#xff0…

计算机网络之传输层(传输层的功能)

一、数据分段与重组 传输层从会话层接收数据&#xff0c;并将其分割成较小的数据段&#xff0c;以适应网络层的最大传输单元&#xff08;MTU&#xff09;限制。在目的端&#xff0c;传输层负责将这些数据段重新组合成原始数据&#xff0c;确保数据的完整性和正确性。 二、端口…

MySQL索引失效

MySQL索引失效会导致查询性能下降&#xff0c;常见原因及解决方案如下&#xff1a; 一、使用OR条件 原因&#xff1a;当OR条件中有一个列没有索引时&#xff0c;索引可能失效 解决方法&#xff1a;确保OR条件中的所有列都有索引&#xff0c;或使用UNION替代OR -- 不推荐 SE…