编码加密 · 哈希算法

Bcrypt

密码 hash/校验/cost 调节

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 119 次使用
纯本地计算 · 密码不出浏览器 · 自写 bcrypt
密码password · 最长 72 字节
Cost 工作因子2^cost 轮 · 越大越慢越安全
10
计算中…
版本
COST
盐 22 字符
哈希 31 字符
就绪 · bcrypt 自带 salt · OWASP 建议 cost 10-12
第一节

关于本工具

About

后端收到一个注册请求,密码明文在日志里一闪而过——这种风险在Bcrypt里不存在。输入密码和盐值,工具调用Go服务端计算hash,并允许调节cost参数(4-31,默认10)来平衡安全与速度。hash结果包含算法版本、cost、盐和密文,可直接存入数据库用于后续校验。密码明文不会被记录,计算在服务端完成。

使用场景

壹

用户注册密码入库

创业公司刚搭好用户系统,后端开发在写注册接口时面临两难:明文存密码等于裸奔,但用 MD5 或 SHA 又怕彩虹表秒破。用本工具生成 bcrypt hash,cost 设为 10,单次计算耗时约 80ms,既防预计算攻击,又不会拖慢注册流程。密码库即使被拖,攻击者也要花数十年才能还原一个 8 位密码。

贰

运维审计日志鉴权

公司内部堡垒机每天产生 5 万条操作日志,每条日志需要记录操作人的 token 签名。运维之前用 HMAC-SHA256 做摘要,但密钥一旦泄露,历史日志可被伪造。改用 bcrypt 对 session token 做 hash,每个 token 存为 60 字符的 hash 串,cost 12 确保单次校验耗时 250ms,审计时逐条比对,密钥泄露也无法反推出原始 token。

叁

API 密钥存储校验

第三方 SaaS 平台为每个商户生成 API Key,需要在服务端存储 10 万条密钥用于请求鉴权。用 bcrypt 存储每条密钥的 hash,cost 设为 8,单次校验耗时 20ms,10 万次校验总耗时约 30 分钟,但密钥泄露时攻击者无法从 hash 反推原始密钥。相比 SHA-256 的即时校验,用 30 分钟换取密钥不可逆的安全性,在夜间批量校验场景中可接受。

肆

密码强度合规审计

金融科技公司过 PCI DSS 合规审计,审计员要求证明所有用户密码存储方式满足最低 10 轮 bcrypt 标准。安全工程师用本工具对生产库中 20 万个密码 hash 做批量校验:输入每个 hash 和原始密码,工具自动解析出当前 cost 值(如 12),并显示校验结果。审计报告附上 20 个随机样本的校验截图,cost 均 ≥ 10,一次性通过。

伍

旧系统密码迁移验证

企业从遗留系统迁移到新平台,原有 3 万条密码用 MD5 存储,安全团队要求迁移后全部升级为 bcrypt。运维写脚本遍历旧密码,对每个明文密码用本工具生成新 hash(cost 10),并做双向校验:旧 MD5 与新 bcrypt 对应同一明文。迁移过程中发现 2% 的密码因编码问题校验失败,本工具能逐条定位失败记录,避免全量回滚。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「密码」输入框中键入待处理的明文密码,字符数无上限,输入即触发计算
  2. 2在「Cost」滑块或输入框中设定工作因子(默认 10),值越大 hash 耗时越长、安全性越高
  3. 3点击「生成 Hash」按钮,后端返回 60 字符的 Bcrypt hash 字符串,格式为 $2b$10$...
  4. 4切换至「校验」标签页,在「密码」和「Hash」两个输入框中分别填入明文与已有 hash,点击「校验」按钮,页面显示「匹配」或「不匹配」结果

输入输出示例

输入输出说明
mypassword123$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy常规:典型密码输入,cost=10 是 Bcrypt 默认值,验证基本 hash 输出格式($2a$ + cost + salt + hash)
HelloWorld!@#$2a$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36PQm4sEPhMNPfFhpGxqS6i常规:含特殊字符的密码,验证 Bcrypt 对 ASCII 可打印字符的完整支持
a$2a$10$XQ2Cq1k9M5Z0F1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T边界:单字符密码,验证 Bcrypt 对极短输入的处理(不会报错)
aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789!@#$%^&*()_+-=[]{}|;':",./<>?`~$2a$10$Z1Y2X3W4V5U6T7S8R9Q0P1O2N3M4L5K6J7I8H9G0F1E2D3C4B5A6边界:72 字节长密码(Bcrypt 截断点),验证 Bcrypt 只处理前 72 字节,超长部分被忽略
aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789!@#$%^&*()_+-=[]{}|;':",./<>?`~X$2a$10$Z1Y2X3W4V5U6T7S8R9Q0P1O2N3M4L5K6J7I8H9G0F1E2D3C4B5A6边界:73 字节长密码,输出与上一条完全相同,验证截断行为(第 73 字节不影响结果)
password$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy易错:常见弱密码,与第一条输入不同但输出不同(salt 随机),验证每次 hash 结果唯一性
mypassword123$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy易错:与第一条输入完全相同,但输出不同(salt 随机),验证 Bcrypt 每次生成不同 hash

常见错误对照

1.cost 值设太大,hash 生成极慢

✗ 错误bcrypt.cost = 20
✓ 修复bcrypt.cost = 10

cost 每 +1,计算时间翻倍。cost=20 单次 hash 需数分钟,生产环境通常 10~12 平衡安全与性能。

2.校验时用明文直接比较 hash 字符串

✗ 错误if (inputPassword === storedHash) { ... }
✓ 修复if (bcrypt.compare(inputPassword, storedHash)) { ... }

bcrypt hash 包含盐和算法版本,每次结果不同。必须用专用 compare 函数解构 hash 并比对,不能字符串相等。

3.截断密码超过 72 字节

✗ 错误bcrypt.hash('password1234567890...(超过72字节)', cost)
✓ 修复先对密码做 SHA-256 再 bcrypt,或使用支持更长密码的算法(如 argon2)

bcrypt 内部只处理前 72 字节,超长部分静默忽略。攻击者可利用此特性用短前缀碰撞长密码。

4.使用过时 $2a$ 前缀

✗ 错误$2a$10$...
✓ 修复$2b$10$... 或 $2y$10$...

$2a$ 在 PHP 早期实现有 bug(非 ASCII 字符处理),$2b$ 修复了该 bug,$2y$ 是额外兼容版本。新实现应使用 $2b$。

5.hash 结果中混入不可打印字符

✗ 错误将 bcrypt hash 直接存为 UTF-8 文本(含换行/控制符)
✓ 修复bcrypt hash 输出是 Base64 编码的 ASCII 字符串,可直接存文本字段

bcrypt 输出是 60 字符的定长字符串($2b$10$...),只含字母数字和 $./,无特殊字符。若出现不可打印字符,说明实现有 bug。

6.每次注册用相同 cost 但未验证最低安全阈值

✗ 错误cost = 4
✓ 修复cost >= 10

cost=4 单次 hash 毫秒级完成,GPU 暴力破解极快。2025 年安全下限是 cost=10(约 100ms),敏感系统建议 cost=12。

7.在 compare 前对密码做额外编码/哈希

✗ 错误bcrypt.compare(sha256(inputPassword), storedHash)
✓ 修复bcrypt.compare(inputPassword, storedHash)

bcrypt 内部已处理编码和盐。额外哈希会改变输入空间,导致永远无法匹配原始 hash,且破坏 bcrypt 的抗 GPU 设计。

第三节

工作原理

How It Works

核心公式

hash = bcrypt(密码, salt, cost) = EksBlowfish(密码, salt, 2^cost)

变量说明

  • 密码明文密码字符串
  • salt16 字节随机盐值,Base64 编码
  • cost工作因子,2^cost 轮迭代,范围 4–31
  • EksBlowfish增强版 Blowfish 密钥扩展算法

示例

密码 'P@ssw0rd'、salt 'abcdefghijklmnop'(16 字节)、cost=10:bcrypt 先初始化 Blowfish 状态,用 salt 和密码进行 2^10=1024 轮密钥扩展,每轮包含 64 次 S-box 替换与 XOR 操作,最终输出 60 字符 hash 串 '$2a$10$abcdefghijklmnop...',其中 '$2a$10$' 标识算法版本与 cost。

原始密码(明文)Bcrypt 哈希运算加盐 + 迭代(Cost 因子)生成固定长度密文哈希密文($2a$...)密码校验输入密码 vs 存储密文返回匹配/不匹配校验结果(true / false)复用哈希算法
用户输入 后端处理 输出结果
第五节

常见问题

Q & A
问Bcrypt 生成的 hash 每次都不一样,同一个密码怎么校验?+
答

Bcrypt 每次加密会随机生成一段 salt(盐值)拼在 hash 结果里,所以同一密码每次输出不同是正常现象,不是 bug。校验时工具会自动从 hash 字符串中提取 salt 重新计算并比对,你只需把原始密码和之前生成的完整 hash 字符串分别填入对应输入框,点击校验即可,结果会明确显示匹配或不匹配。

问cost 值设多少合适?设高了会不会很慢?+
答

cost 值控制迭代次数(2^cost 轮),默认 10 对应约 2^10=1024 轮,通常 0.5-1 秒内完成。设到 12 以上(4096 轮)后端响应会明显变慢,超过 14 可能超时。建议开发环境用 10-12,生产环境根据服务器性能测试后定在 0.3-1.5 秒内能完成的值,既保证安全又不影响用户体验。本工具默认 cost=10,你可以在输入框右侧手动调整。

问Bcrypt 和 SHA256 比哪个更安全?+
答

SHA256 是通用哈希,设计目标是快速计算,适合校验完整性;Bcrypt 是专门为密码存储设计的慢哈希,内置 salt 和可调节 cost,能抵抗 GPU/ASIC 暴力破解。密码存储场景下 Bcrypt 安全性远高于 SHA256。如果你在做用户密码入库,必须用 Bcrypt 或同类慢哈希(如 Argon2),不要用 SHA256 直接存密码。

问密码最长能输多长?Bcrypt 有长度限制吗?+
答

Bcrypt 标准实现中密码长度上限是 72 字节(ASCII 字符约 72 个,中文按 UTF-8 编码后可能更少)。超过 72 字节的部分会被静默截断,不会报错。本工具输入框不做硬截断,但建议用户密码控制在 72 字符以内。需要超长密码的场景(如 API key 哈希),可先对密码做一次 SHA256 再传入 Bcrypt,但注意这会改变兼容性。

问我把 hash 字符串粘贴进去校验,提示格式不对怎么办?+
答

Bcrypt hash 字符串固定格式为 '$2a$10$...'(或 $2b$/$2y$),总长 60 字符,其中包含算法标识、cost、salt 和 hash 四段。常见错误:1)粘贴了不带前缀的部分;2)混入了空格或换行;3)从数据库导出时字段被截断。请确保复制完整的 60 字符 hash,本工具输入框右侧有格式提示,也可在输入后看下方实时校验是否识别成功。

问这个工具是后端处理还是浏览器处理?密码会不会上传到服务器?+
答

本工具是后端(BE)实现,你输入的密码和 hash 会通过网络发送到服务器进行运算,处理完成后服务器端不会持久存储你的数据。如果你对隐私有更高要求(如处理内部系统密码),建议使用纯浏览器端(WASM)实现的 Bcrypt 工具,数据完全不出本地。本工具页面底部已标注实现方式为 BE,请注意区分。

问为什么我用 Bcrypt 加密后,用其他工具校验却失败?+
答

最常见原因是算法标识不兼容。Bcrypt 有 $2a$、$2b$、$2y$ 三种前缀,早期 PHP 实现用 $2a$ 但存在 Unicode 处理 bug,后来修正版用 $2b$,部分旧工具只认 $2a$。本工具默认输出 $2a$(兼容性最好),如果目标系统要求 $2b$,可手动替换 hash 前缀后重试。另一个原因是 cost 值不同,但校验时工具会自动读取 hash 里的 cost,不需要手动匹配。

问Bcrypt 能用来加密中文密码吗?+
答

可以,Bcrypt 对输入数据按字节处理,不关心字符编码。但要注意中文 UTF-8 编码后每个汉字占 3 字节,72 字节限制下最多只能输入约 24 个汉字。不同工具或系统可能使用不同编码(如 GBK),导致同一中文在不同编码下产生不同 hash。建议后端统一使用 UTF-8 编码,并确保注册和登录时编码一致。本工具默认按 UTF-8 处理输入。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭