bcrypt算法¶
bcrypt是一种专门为密码存储设计的哈希函数,基于Blowfish加密算法。
- 它的主要特点是:
- 加盐(Salting)
bcrypt在哈希过程中引入一个随机生成的盐值,与密码一起进行哈希处理
即使两个用户使用相同的密码,生成的哈希值也会不同,从而防止了彩虹表攻击。
- 自适应性(Adaptiveness)
bcrypt允许通过调整迭代次数(cost factor)来控制哈希计算的复杂度。
随着计算能力的提升,可以增加迭代次数,使得哈希过程变得更加缓慢,从而增强安全性。
基本¶
应用场景¶
bcrypt广泛应用于需要存储和验证密码的场景,如Web应用程序、数据库和身份验证系统。
由于其高安全性,许多操作系统和Linux发行版(如OpenBSD和SUSE Linux)将bcrypt作为默认的密码哈希算法。
优点¶
高安全性: 通过加盐和自适应性,bcrypt有效防止了彩虹表和暴力破解攻击。
可调节性: 可以根据需要调整迭代次数,以平衡安全性和性能。
广泛支持: 在多种编程语言中都有实现,如C、C++、Java、Python等。
缺点¶
性能开销: 由于多次迭代,bcrypt的哈希过程相对较慢,可能影响系统性能。
内存消耗: bcrypt需要一定的内存来存储盐值和中间结果,可能对资源有限的环境造成挑战。
核心说明¶
- 存储格式
格式: {编码类型}格式化工作因子+固定长度随机盐值+编码密钥
示例: {bcrypt}$2a$10$f28x4Dw4YQ.CmGPTaVB86.uMIHe1XEgCwv6XH19xqP1lg031gz6.6
- 解释:
{bcrypt}: bcrypt算法
$2a$10$: 工作因子。决定了哈希计算的复杂度,数值越大,计算所需时间越长,从而提高安全性
f28x4Dw4YQ.CmGPTaVB86.uMIHe1X: 随机盐值。一个随机生成的字符串,用于防止彩虹表攻击
EgCwv6XHI9xqP1lgO31gz6.6:编码密钥。实际的密码哈希结果。
- 编码逻辑
指定编码算法类型和工作因子:选择bcrypt作为编码算法,并设定工作因子(如10),这将影响哈希计算的迭代次数
生成固定长度随机盐值:创建一个随机的、固定长度的盐值,以增强密码的安全性
编码明文密码:使用bcrypt算法、工作因子和盐值对原始密码进行哈希处理
组装最终编码密码串:将上述三部分组合成一个完整的哈希字符串,用于存储
- 验证逻辑(当需要验证用户输入的密码时):
解析编码算法类型:从存储的哈希字符串中识别出使用的算法(如bcrypt)
解析工作因子和随机盐值:从哈希字符串中提取出之前设置的工作因子和盐值
使用相同算法对明文密码进行编码:用相同的bcrypt算法、工作因子和盐值对用户输入的明文密码进行哈希处理
对比编码密码串是否相等:将新生成的哈希值与存储的哈希值进行比较,如果两者相同,则说明密码正确