Skip to content
HeZzz
Go back

BCrypt

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

BCrypt 介绍

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

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

BCrypt 工作原理

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

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

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

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

项目中的应用

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

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

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);
    }
}

Share this post on:

上一篇
RBAC
下一篇
人智基础-2025sp-重点笔记