123问免费工具与知识服务
123问工具大全› 工具大全› 加密编码› bcrypt哈希

🔑 bcrypt哈希

密码哈希 · 盐轮数可调 · 验证匹配

bcrypt哈希常见问题

bcrypt是什么?

bcrypt是一种专为密码存储设计的哈希算法,基于Blowfish加密算法,内置salt(盐)和可调节的迭代(成本因子),能有效抵御彩虹表和暴力破解攻击。

盐轮数(salt rounds)选多少合适?

轮数越高越安全,但计算时间也越长。4-8适合快速测试,10-12适合一般应用,12-16适合高安全场景。轮数每增加1,计算时间翻倍。

为什么用bcrypt而不是SHA256?

SHA256等通用哈希算法极快,攻击者可以每秒尝试数十亿次。bcrypt故意设计为慢速算法,且每个密码用不同的盐,是密码存储的最佳实践。

bcrypt的哈希长什么样?怎么解读?

形如 $2a$10$由几段组成:$2a(或$2b/$2y)表示版本,10是成本因子,接着22字符是用自定义Base64编码的盐,最后31字符是哈希主体。验证时从哈希里取出盐和轮数重新计算比对。

版本号$2a、$2b、$2y有什么区别?

$2a是最早广泛使用的版本;$2b修复了长密码(超过72字节)的一个长度处理bug,是PHP等语言的推荐版本;$2y是某些PHP旧版本对$2a的兼容别名。它们都能互相验证,但新项目建议用$2b。

bcrypt对密码长度有限制吗?

有。bcrypt只处理密码的前72字节,超过的部分会被截断忽略。所以别依赖超长密码的安全增益,更好的做法是配合最少8-12位、大小写数字符号混合的密码策略。

为什么每次生成同一个密码的哈希都不一样?

因为每次生成都会随机产生一个不同的盐。盐不同,哈希自然不同。验证时工具会自动从哈希里读出盐来重算,所以验证用的是"比对"而不是"加密后再比较"。

bcrypt和argon2/scrypt怎么选?

三者的思路一致:慢哈希+盐。argon2是2015年后推出的最新内存硬性算法,抗GPU/ASIC破解更强,是新一代推荐;scrypt强调内存占用。bcrypt最成熟、支持最广,依然是完全合格的选择。

bcrypt哈希 - 示例演示

示例一:生成一个标准bcrypt哈希

输入:密码"myPassw0rd!2024",成本因子10
结果:得到形如 $2a$10$...的60字符哈希,每次生成结果因随机盐而不同
这是Web应用存储用户密码的标准做法,数据库里存的就是这个字符串。

示例二:验证密码是否匹配

输入:密码"myPassw0rd!2024",粘贴已生成的哈希到"已有Hash"
结果:验证通过,提示"密码匹配";如果输入错误密码则提示不匹配
验证时不需要重新输入salt rounds,工具会从哈希里自动读取。

示例三:对比不同成本因子的耗时

输入:同一密码,分别用成本因子5、10、14生成
结果:因子5几乎瞬间完成,10约需几十毫秒,14约需几百毫秒到1秒以上
这就是bcrypt"慢"的体现:每高一档时间翻倍,代价是攻击者暴力破解成本也翻倍。

bcrypt哈希深度解读

bcrypt的原理:为什么它"慢"反而安全?

bcrypt源自Blowfish分组密码的密钥扩展过程(eksblowfish),把密码当作密钥,反复执行2^cost轮复杂运算。

成本因子每加1,运算次数翻倍。成本因子10=1024次,14=16384次,因子20以上对普通CPU来说要算很久。

关键在于"不对称":合法用户验证一次只需几百毫秒,但攻击者要猜密码就要每次都付出同样代价,暴力破解的吞吐量被压到极低。

bcrypt成本因子与大致耗时(参考)
成本因子迭代次数普通CPU耗时
416次<1毫秒
8256次约几毫秒
101024次约50-100毫秒
124096次约200-400毫秒
1416384次约800毫秒-1秒

盐(salt)为什么必不可少?

盐是一个随机生成的字符串,和密码一起参与哈希计算。没有盐会出现两个问题:

  • 相同密码产生相同哈希,攻击者可用预计算的"彩虹表"直接查表还原。
  • 数据库里大量相同密码的哈希可被一次批量破解。
  • 有了盐,相同密码的哈希也各不相同,彩虹表彻底失效。
  • bcrypt把盐直接内嵌进哈希串里,无需单独存储,验证时自动取出。

正确存储用户密码的完整姿势

密码存储方案对比
方案是否推荐原因
明文存储绝对不行一旦数据库泄露全部密码裸露
MD5/SHA256不行太快且无盐,秒破
MD5+固定盐不行盐固定等于没盐
bcrypt/scrypt/argon2推荐慢哈希+随机盐

此外还要配合:注册时校验密码强度、登录时用恒定时间比较、定期评估成本因子、密码泄露后强制重置。

bcrypt哈希串结构拆解

一个完整bcrypt哈希长这样:$2b$10$N9qo8uLOickgx2ZMRZoMyeIvK8QW9UEyD0X9vJ9vQzL8Z0N0wQ====

  • 第1段 $2b 是算法版本标识。
  • 第2段 10 是成本因子(迭代次数的2的幂)。
  • 第3段 22个字符 是盐的Base64表示。
  • 第4段 31个字符 是最终哈希主体。
  • 整串通常60字符左右,可直接存进CHAR/VARCHAR(60)字段。

bcrypt哈希参考数据

bcrypt与常见哈希算法对比

算法输出长度是否有盐速度密码存储
MD5128位(32字符)可加极快不推荐
SHA-256256位(64字符)可加快不推荐
bcrypt60字符内置随机盐慢推荐
scrypt可配置内置慢推荐
argon2可配置内置慢新一代推荐

bcrypt哈希串字段分段表

分段含义示例
$2b$版本标识$2b$
10成本因子10
22字符盐(Base64)N9qo8uLOickgx2ZMRZoMyeI
31字符哈希主体vK8QW9UEyD0X9vJ9vQzL8Z0N0wQ

使用说明

使用方法

1. 输入密码。

2. 调整盐轮数(默认10)。

3. 点击"生成Hash"生成bcrypt哈希。

4. 也可以用"验证Hash"功能检查密码和已有hash是否匹配。

分享工具: Facebook Twitter 微博 复制链接