Bcrypt哈希生成

2 个评分中的 5 个
Bcrypt哈希生成

Bcrypt哈希生成是一款免费工具,可将任意输入字符串生成bcrypt密码哈希,用于安全存储密码。

什么是bcrypt,它现在还安全吗?

只要设置了合适的成本因子,bcrypt仍然适合用于存储密码,不过新系统通常更倾向于使用Argon2id。Niels Provos和David Mazières于1999年设计了bcrypt。他们利用Blowfish密码的密钥调度过程,有意提高每次密码猜测的计算成本。

哈希是单向过程,因此应用程序验证密码时,会按照已存储的参数对候选密码进行哈希,而不是还原原始密码。与SHA-3等通用算法不同,bcrypt会生成一条固定长度的自包含编码记录,其中包含版本、成本因子、盐值和校验值。

标准bcrypt记录由60个ASCII字符组成。其校验值表示184位数据,并使用bcrypt自己的类Base64编码表示为31个字符。目前并不认为bcrypt在密码学上已被攻破,但传统实现受设计年代所限,最多只能处理72个输入字节。此外,Argon2id还提供bcrypt不具备的内存困难型防护。

示意图:输入文本经过 Bcrypt 函数生成固定长度的哈希值,且无法还原

如何使用Bcrypt哈希生成?

输入需要进行哈希处理的字符串,运行生成工具,然后复制Bcrypt哈希结果字段中显示的值。请保存完整结果,不要只提取末尾的校验值。

  1. 输入准确的密码或测试字符串,包括其中的大小写、空格和标点。
  2. 生成bcrypt结果。
  3. 复制全部60个字符,包括开头的版本标记和成本因子。
  4. 将结果保存到数据库的密码哈希字段中。
  5. 用户登录时,请使用平台提供的bcrypt验证函数,不要重新生成哈希后直接比较文本。
digily.link 上的 Bcrypt哈希生成 工具及其输入表单

Bcrypt通常会为每次哈希生成新的随机盐值。因此,即使对同一输入执行两次哈希,也可能得到两条不同的记录,而且两条记录都能验证该输入。这是正常现象,可以防止相同密码产生相同的存储值。

计算在服务器上完成。你的输入会通过HTTPS传输到服务器,并且不会被存储。如果要处理真实的生产环境密码,请先确认将其输入任何第三方在线服务是否符合你所在组织的安全政策。

bcrypt哈希可以解密或逆向还原吗?

不可以。bcrypt哈希不是加密数据,也不包含解密密钥,因此无法解密。实际的攻击方式是猜测可能的密码,再逐一使用已存储的哈希进行验证。

Bcrypt通过可配置的成本因子来减慢猜测过程。但它无法让简短、常见或曾经泄露的密码变得安全,执意攻击的攻击者仍可能找出强度较弱的输入。盐值可以防止攻击者针对多个账户重复使用同一张预计算表,但盐值并不是秘密,而是直接包含在存储记录中。

Bcrypt哈希生成 工具生成的结果示例

如何解读bcrypt结果

Bcrypt结果通常采用模块化crypt格式。典型结构为$2y$12$[22-character salt][31-character checksum]。这只是格式示意,并不是某个指定密码的哈希值。

组成部分 典型长度 作用
版本标记 4个字符 标识bcrypt变体,例如$2y$或$2b$。
成本因子 3个字符 记录两位数的成本因子及其后的分隔符。
盐值 22个字符 对128位随机盐值进行编码。
校验值 31个字符 对184位bcrypt校验值进行编码。

请将这些部分完整保存在一起。修改任何字符、截短结果,或将其存入长度不足的字段,通常都会导致验证失败。不同兼容库使用的版本标记可能有所不同,因此应用程序应使用成熟的密码API,而不是自行解析并重新拼接记录。

什么时候适合使用bcrypt?

bcrypt适合在已经支持它的系统中用于密码哈希,尤其是需要兼容现有数据库或框架时。bcrypt经过刻意设计,计算速度较慢,并且使用盐值,因此不适合作为通用文件校验值或去重标识符。

  • 适合使用的场景:应用程序密码、迁移测试、检查数据库字段长度,以及复现与bcrypt兼容的开发环境。
  • 请改用Argon2id:适用于平台支持Argon2id且能够正确管理其内存参数的新密码系统。
  • 请改用SHA-3:适用于文件完整性校验、内容指纹或去重。SHA-3/384哈希生成和SHA-3/512哈希生成用于生成通用摘要,而不是密码记录。
  • 不要使用bcrypt:不要用它进行数字签名、消息认证或加密,也不要用它存储以后需要还原的数据。

空格、标点和数字都会作为输入数据处理,不会被忽略。带重音符号的字符和非拉丁字符会先编码为字节,然后再由bcrypt处理。因此,两个系统必须生成完全相同的字节,包括使用一致的字符编码和Unicode规范化方式。这里尤其要注意72字节的限制,因为一个Unicode字符可能占用多个字节。技术上可以对空输入进行哈希,但空密码对猜测攻击没有任何实际抵抗力。

常见问题

数据库需要为bcrypt哈希预留多少空间?

对于常规bcrypt记录,至少应预留60个ASCII字符。稍宽一些的字段有助于日后迁移密码算法,而标准编码形式不需要使用二进制字段。

现有的SHA密码哈希能迁移到bcrypt吗?

如果不知道原始密码,就无法将现有SHA摘要转换成该密码对应的bcrypt哈希。常见的迁移方法是,在用户下次登录时先验证旧哈希,然后使用bcrypt或Argon2id对用户提供的密码进行哈希,并替换旧记录。

保存结果前,请确认已复制完整的60字符值,数据库字段不会将其截断,并且接收该结果的应用程序支持记录中的版本标记。

热门工具