BCrypt
把盐存到了哈希字符串内比较松弛,但是每次加的盐都不一样又弥补了这一点。给你一个 matches 方法,这就可以避免你分不清他们是否匹配。
BCrypt 介绍
BCrypt 是一种基于 Blowfish 加密算法的密码哈希函数,设计用于保护密码。
除了加盐以防御彩虹表攻击以外,BCrypt 还具有自适应性,可以通过增加计算成本来抵御硬件加速的暴力破解攻击。
BCrypt 工作原理
在 BCrypt 中,密码加密过程主要包括以下几个步骤:
- 加盐(Salting):每次加密的时候采用不同的盐,即使是相同的密码,每次加密后的结果也会不同,从而防止彩虹表攻击。
- 哈希计算(Hashing):BCrypt 使用 Blowfish 加密算法对密码进行多轮哈希计算,增加破解难度。
- 自适应性(Adaptive):BCrypt 允许通过调整工作因子(cost factor)来增加计算复杂度,从而抵御未来更强大的硬件攻击。
在 BCrypt 中,判断密码是否匹配时主要包括以下步骤:
- 提取盐和工作因子:从存储的哈希值中提取出盐和工作因子。
- 重新计算哈希值:使用提取的盐和工作因子,对输入的明文密码进行哈希计算。
- 比较哈希值:将重新计算的哈希值与存储的哈希值进行比较,如果相同则表示密码匹配,否则不匹配。
项目中的应用
在本项目中,BCrypt 主要用于以下场景:
- 用户注册:在用户注册时,系统会使用 BCrypt 对用户输入的密码进行加密,并将加密后的哈希值存储在数据库中。
- 用户登录:在用户登录时,系统会使用 BCrypt 对输入的密码进行哈希计算,并将结果与数据库中存储的哈希值进行比较,以验证用户身份。
- 密码修改:在用户修改密码时,系统会使用 BCrypt 对新密码进行加密,并更新数据库中的哈希值。
具体实现在 PasswordEncoderUtil
类中,使用 Spring Security 提供的 BCryptPasswordEncoder
进行密码加密和验证。
1 | package com.test.utils; |