用户注册密码入库
创业公司刚搭好用户系统,后端开发在写注册接口时面临两难:明文存密码等于裸奔,但用 MD5 或 SHA 又怕彩虹表秒破。用本工具生成 bcrypt hash,cost 设为 10,单次计算耗时约 80ms,既防预计算攻击,又不会拖慢注册流程。密码库即使被拖,攻击者也要花数十年才能还原一个 8 位密码。
后端收到一个注册请求,密码明文在日志里一闪而过——这种风险在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。
第三方 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% 的密码因编码问题校验失败,本工具能逐条定位失败记录,避免全量回滚。
| 输入 | 输出 | 说明 |
|---|---|---|
| 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 = 20bcrypt.cost = 10cost 每 +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 = 4cost >= 10cost=4 单次 hash 毫秒级完成,GPU 暴力破解极快。2025 年安全下限是 cost=10(约 100ms),敏感系统建议 cost=12。
7.在 compare 前对密码做额外编码/哈希
bcrypt.compare(sha256(inputPassword), storedHash)bcrypt.compare(inputPassword, storedHash)bcrypt 内部已处理编码和盐。额外哈希会改变输入空间,导致永远无法匹配原始 hash,且破坏 bcrypt 的抗 GPU 设计。
hash = bcrypt(密码, salt, cost) = EksBlowfish(密码, salt, 2^cost)
密码明文密码字符串salt16 字节随机盐值,Base64 编码cost工作因子,2^cost 轮迭代,范围 4–31EksBlowfish增强版 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 每次加密会随机生成一段 salt(盐值)拼在 hash 结果里,所以同一密码每次输出不同是正常现象,不是 bug。校验时工具会自动从 hash 字符串中提取 salt 重新计算并比对,你只需把原始密码和之前生成的完整 hash 字符串分别填入对应输入框,点击校验即可,结果会明确显示匹配或不匹配。
cost 值控制迭代次数(2^cost 轮),默认 10 对应约 2^10=1024 轮,通常 0.5-1 秒内完成。设到 12 以上(4096 轮)后端响应会明显变慢,超过 14 可能超时。建议开发环境用 10-12,生产环境根据服务器性能测试后定在 0.3-1.5 秒内能完成的值,既保证安全又不影响用户体验。本工具默认 cost=10,你可以在输入框右侧手动调整。
SHA256 是通用哈希,设计目标是快速计算,适合校验完整性;Bcrypt 是专门为密码存储设计的慢哈希,内置 salt 和可调节 cost,能抵抗 GPU/ASIC 暴力破解。密码存储场景下 Bcrypt 安全性远高于 SHA256。如果你在做用户密码入库,必须用 Bcrypt 或同类慢哈希(如 Argon2),不要用 SHA256 直接存密码。
Bcrypt 标准实现中密码长度上限是 72 字节(ASCII 字符约 72 个,中文按 UTF-8 编码后可能更少)。超过 72 字节的部分会被静默截断,不会报错。本工具输入框不做硬截断,但建议用户密码控制在 72 字符以内。需要超长密码的场景(如 API key 哈希),可先对密码做一次 SHA256 再传入 Bcrypt,但注意这会改变兼容性。
Bcrypt hash 字符串固定格式为 '$2a$10$...'(或 $2b$/$2y$),总长 60 字符,其中包含算法标识、cost、salt 和 hash 四段。常见错误:1)粘贴了不带前缀的部分;2)混入了空格或换行;3)从数据库导出时字段被截断。请确保复制完整的 60 字符 hash,本工具输入框右侧有格式提示,也可在输入后看下方实时校验是否识别成功。
本工具是后端(BE)实现,你输入的密码和 hash 会通过网络发送到服务器进行运算,处理完成后服务器端不会持久存储你的数据。如果你对隐私有更高要求(如处理内部系统密码),建议使用纯浏览器端(WASM)实现的 Bcrypt 工具,数据完全不出本地。本工具页面底部已标注实现方式为 BE,请注意区分。
最常见原因是算法标识不兼容。Bcrypt 有 $2a$、$2b$、$2y$ 三种前缀,早期 PHP 实现用 $2a$ 但存在 Unicode 处理 bug,后来修正版用 $2b$,部分旧工具只认 $2a$。本工具默认输出 $2a$(兼容性最好),如果目标系统要求 $2b$,可手动替换 hash 前缀后重试。另一个原因是 cost 值不同,但校验时工具会自动读取 hash 里的 cost,不需要手动匹配。
可以,Bcrypt 对输入数据按字节处理,不关心字符编码。但要注意中文 UTF-8 编码后每个汉字占 3 字节,72 字节限制下最多只能输入约 24 个汉字。不同工具或系统可能使用不同编码(如 GBK),导致同一中文在不同编码下产生不同 hash。建议后端统一使用 UTF-8 编码,并确保注册和登录时编码一致。本工具默认按 UTF-8 处理输入。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。