BCrypt

把盐存到了哈希字符串内比较松弛,但是每次加的盐都不一样又弥补了这一点。给你一个 matches 方法,这就可以避免你分不清他们是否匹配。

BCrypt 介绍

BCrypt 是一种基于 Blowfish 加密算法的密码哈希函数,设计用于保护密码。

除了加盐以防御彩虹表攻击以外,BCrypt 还具有自适应性,可以通过增加计算成本来抵御硬件加速的暴力破解攻击。

BCrypt 工作原理

在 BCrypt 中,密码加密过程主要包括以下几个步骤:

  1. 加盐(Salting):每次加密的时候采用不同的盐,即使是相同的密码,每次加密后的结果也会不同,从而防止彩虹表攻击。
  2. 哈希计算(Hashing):BCrypt 使用 Blowfish 加密算法对密码进行多轮哈希计算,增加破解难度。
  3. 自适应性(Adaptive):BCrypt 允许通过调整工作因子(cost factor)来增加计算复杂度,从而抵御未来更强大的硬件攻击。

在 BCrypt 中,判断密码是否匹配时主要包括以下步骤:

  1. 提取盐和工作因子:从存储的哈希值中提取出盐和工作因子。
  2. 重新计算哈希值:使用提取的盐和工作因子,对输入的明文密码进行哈希计算。
  3. 比较哈希值:将重新计算的哈希值与存储的哈希值进行比较,如果相同则表示密码匹配,否则不匹配。

项目中的应用

在本项目中,BCrypt 主要用于以下场景:

  • 用户注册:在用户注册时,系统会使用 BCrypt 对用户输入的密码进行加密,并将加密后的哈希值存储在数据库中。
  • 用户登录:在用户登录时,系统会使用 BCrypt 对输入的密码进行哈希计算,并将结果与数据库中存储的哈希值进行比较,以验证用户身份。
  • 密码修改:在用户修改密码时,系统会使用 BCrypt 对新密码进行加密,并更新数据库中的哈希值。

具体实现在 PasswordEncoderUtil 类中,使用 Spring Security 提供的 BCryptPasswordEncoder 进行密码加密和验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.test.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class PasswordEncoderUtil {
// BCryptPasswordEncoder
private static final PasswordEncoder encoder = new BCryptPasswordEncoder();

/**
* 使用BCrypt加密密码
* @param rawPassword 明文密码
* @return 加密后的密码
*/
public static String encode(String rawPassword) {
return encoder.encode(rawPassword);
}

/**
* 验证密码是否匹配
* @param rawPassword 明文密码
* @param encodedPassword 加密后的密码
* @return 是否匹配
*/
public static boolean matches(String rawPassword, String encodedPassword) {
return encoder.matches(rawPassword, encodedPassword);
}
}