Skip to content

Bcrypt 哈希生成器与验证器

在线生成并验证 bcrypt 密码哈希——可调成本因子,支持 $2b$/$2a$/$2y$ 前缀。100% 在浏览器中运行,密码绝不上传。

无追踪 浏览器中运行 免费
100% 在浏览器中运行——你的密码绝不离开你的设备。
Bcrypt 哈希
哈希结构
版本
成本
盐值
摘要

遵循 bcrypt 参考行为,输出已对照 Node bcrypt、Python bcrypt 和 Apache htpasswd 交叉校验 — Go Tools 安全团队 · 2026年6月12日

什么是 Bcrypt?

Bcrypt 是一种专为安全存储密码而设计的密码哈希函数。服务器不会以明文保存密码,而是存储单向的 bcrypt 哈希;用户登录时,服务器以同样方式哈希提交的密码,并检查两个哈希是否匹配。Bcrypt 构建于 Blowfish 密码之上,由 Niels Provos 和 David Mazières 于 1999 年设计,它有一个刻意的特性使其区别于 SHA-256 这类通用哈希:它是故意慢的,而且随着硬件变快,你还可以通过可调的成本因子让它随时间变得更慢。

bcrypt 哈希是单一、自描述的 60 字符字符串——例如 $2b$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq。它打包了四部分:版本$2b$)、成本12,对数级工作因子)、22 个字符的 Base64 盐值,以及 31 个字符的 Base64 摘要。由于盐值是随机的且内嵌在哈希中,同一密码每次都会产生不同的哈希——这能挫败彩虹表,并隐藏两个用户选用了相同密码的事实。验证时会从存储的哈希中读回盐值和成本并对候选密码重新哈希,因此 bcrypt 从不需要(也无法)逆向哈希来还原密码。

本工具使用内置的 bcrypt 实现完全在你的浏览器中运行——任何密码或哈希都不会上传。用它来生成带指定成本和前缀的哈希、用密码验证已有哈希,以及读取哈希的结构。它能与其他安全工具自然搭配:用我们的 htpasswd 生成器(可直接输出 bcrypt 条目)通过 HTTP Basic Auth 保护目录,用我们的 随机密码生成器 生成要哈希的强密码,当你需要快速的通用校验和而非缓慢的密码哈希时,则使用我们的 SHA-256 生成器。如果你正在决定用哪种算法存储密码,可在 bcrypt vs Argon2 vs scrypt 中对比各选项。

// Node.js — bcryptjs / bcrypt (emits $2b$)
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('correct horse battery staple', 12);
// -> $2b$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq
const ok = await bcrypt.compare('correct horse battery staple', hash); // true

# Python — bcrypt
import bcrypt
hashed = bcrypt.hashpw(b'correct horse battery staple', bcrypt.gensalt(12))
bcrypt.checkpw(b'correct horse battery staple', hashed)  # True

# PHP — password_hash (emits $2y$)
$hash = password_hash('correct horse battery staple', PASSWORD_BCRYPT, ['cost' => 12]);
password_verify('correct horse battery staple', $hash); // true

# Apache htpasswd CLI — bcrypt entry to stdout (-B bcrypt, -b inline, -n stdout)
htpasswd -Bbn admin 'correct horse battery staple'
# -> admin:$2y$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq

核心功能

生成 Bcrypt 哈希

从任意密码生成带全新随机盐值的标准 60 字符 bcrypt 哈希。每次点击都产生一个不同的有效哈希,与真实的密码库行为完全一致。

可调成本因子

在 4 到 15 之间调节工作因子(12 是现代默认值)。感受每一步如何让计算时间大致翻倍,从而挑选一个既强又足够快、不拖慢登录的成本。

选择版本前缀

输出 $2b$(当前 bcryptjs 标准)、$2y$(PHP / Apache htpasswd)或 $2a$(最初版本)。它们在各库间验证时均可互换。

用密码验证哈希

粘贴存储的哈希和候选密码,立即确认它们是否匹配——用内嵌的盐值和成本重新哈希,绝不解密。非常适合调试失败的登录。

哈希结构拆解

查看任意 bcrypt 哈希被拆分为版本、成本、盐值和摘要,让 $2b$12$... 字符串的结构一目了然。

100% 客户端运行

所有哈希计算和验证都在你的浏览器中本地完成。任何密码或哈希都不会发送到服务器,因此你可以私密地处理真实凭证。

Bcrypt 生成器示例

bcrypt 哈希(成本 12,$2b$)

password: correct horse battery staple
cost: 12
prefix: $2b$
$2b$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq

采用 $2b$ 前缀、成本为 12 的 bcrypt 哈希。盐值是随机的,因此同一密码每次都会生成不同的哈希——但它们全都能与原始密码验证通过。

用密码验证哈希

password: correct horse battery staple
hash: $2b$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq
✓ 匹配 — 该密码与此哈希一致

验证不会解密哈希。bcrypt 使用存储哈希中内嵌的盐值和成本对候选密码重新哈希,再比对结果。匹配即表示密码正确。

哈希结构拆解

$2b$12$dUSFKqT1FCMYZ6hcQfsxuONizEqcX8IGK8snfVSowP5Uu.TDJoPUq
版本: $2b$ · 成本: 12 · 盐值: dUSFKqT1FCMYZ6hcQfsxuO · 摘要: NizEqcX8IGK8snfVSowP5Uu.TDJoPUq

每个 bcrypt 哈希都是自描述的:一个版本标记、两位数的成本、22 个字符的 Base64 盐值和 31 个字符的 Base64 摘要,全部包含在一个 60 字符的字符串中。本工具将它们拆开,让你一眼看清。

如何使用 Bcrypt 生成器

  1. 1

    输入密码并选择成本

    在「生成」选项卡上,输入密码或点击「随机密码」。挑选一个成本因子(4–15;12 是现代默认值)和一个版本前缀——$2b$、$2a$ 或 $2y$——以匹配你的技术栈。

  2. 2

    生成哈希

    bcrypt 哈希会在本地用全新的随机盐值计算,并显示为一个 60 字符的 $2b$12$... 字符串。点击「复制」获取它,或重新生成一个新的加盐哈希。

  3. 3

    查看结构或验证

    结构面板将哈希拆分为版本、成本、盐值和摘要。切换到「验证」选项卡,粘贴存储的哈希和密码,即可立即确认它们是否匹配。

Common Errors

试图解密哈希

Bcrypt 是单向的;不存在解密。要校验密码,请用密码验证哈希,而不是尝试逆向摘要。

✗ 错误
bcrypt.decrypt(hash)  // no such operation
✓ 正确
bcrypt.compare(password, hash)  // returns true / false

把成本设得太低

像 4 或 6 这样的低成本几乎瞬间就能哈希,这也让攻击者能快速暴力破解泄露的哈希。请以 12 作为基线。

✗ 错误
cost: 4  // far too fast, weak against brute force
✓ 正确
cost: 12  // modern default, resists brute force

期望两次得到相同的哈希

由于盐值是随机的,再次哈希同一密码会得到不同的字符串。请用验证来比对,绝不要通过检查两个哈希是否逐字节相等。

✗ 错误
hash(pw) === storedHash  // fails — different salts
✓ 正确
bcrypt.compare(pw, storedHash)  // correct check

常见使用场景

在数据库中预置密码哈希
为管理员或测试账户生成一个 bcrypt 哈希,直接插入到你的 users 表中,这样你无需先搭建完整的注册流程即可登录。
调试失败的登录
用已知正确的密码验证存储的哈希,确认哈希本身是否正确,从而把 bug 从你的认证代码中隔离出来。
挑选合适的成本因子
在你自己的硬件上以多个成本级别生成哈希以感受各自耗时,再选择一个既能抵御暴力破解又不拖慢真实登录的工作因子。
创建 htpasswd / Basic Auth 条目
为 Apache、Docker Registry 或 Caddy 凭证生成 $2y$ bcrypt 哈希,再将其放入用于 HTTP Basic Auth 的 user:hash 行。
构建测试夹具
生成按密码确定的 bcrypt 哈希,用于预置登录或密码重置流程的集成测试,无需搭建真实的认证服务器。
审计你发现的哈希
读取配置或转储中某个 bcrypt 字符串的结构以检查其成本因子,并用你预期的密码验证它以确认是否匹配。

技术细节

基于 Blowfish,自适应成本
Bcrypt 的哈希源自 Blowfish 密码昂贵的密钥设置过程,重复执行 2^cost 次。成本每加 1,工作量翻倍,使该函数随硬件进步仍能抵御暴力破解。
128 位随机盐值
每个哈希内嵌一个 16 字节(128 位)随机盐值,以 Base64 编码为成本之后的 22 个字符。盐值使每个哈希都唯一,因此相同的密码绝不会共用摘要,彩虹表也无从下手。
自描述的 60 字符格式
输出为 $版本$成本$盐值+摘要——一个固定的 60 字符字符串,承载了验证它所需的全部信息。无需单独的盐值列或参数存储。
72 字节密码上限
Bcrypt 只哈希密码的前 72 字节;超出部分会被静默忽略。对于很长的口令,常见的缓解办法是在 bcrypt 之前先预哈希(例如用 SHA-256)。
验证,而非解密
Bcrypt 是单向的。验证会用从存储哈希中解析出的盐值和成本对候选密码重新运行哈希,再以恒定时间比较摘要。没有任何操作能还原明文。
诚实说明与注意事项
哈希在本地计算,绝不会与实际系统校验。复制的哈希以及你输入的任何密码会留存在剪贴板和浏览器内存中——请将它们视为机密,并在粘贴进生产环境后清空剪贴板。

最佳实践

使用成本 12 或更高
成本 12 是现代基线;在登录延迟仍可接受的前提下,可为敏感系统提高到 14 左右。定期重新评估——五年前足够慢的设置,如今攻击起来已经很廉价。
绝不存储或记录明文
只存储 bcrypt 哈希,绝不存储原始密码,并让密码远离日志和错误信息。如果明文随哈希一同泄露,bcrypt 的全部价值就荡然无存了。
让 bcrypt 处理盐值
Bcrypt 会为你生成并内嵌一个安全的随机盐值。不要提供你自己的静态盐值,也不要重复使用——每次哈希一个随机盐值,正是挫败彩虹表的关键。
留意 72 字节上限
如果你接受长口令,记住 bcrypt 会忽略 72 字节之后的内容。当很长的输入必须被完整覆盖时,可考虑先用 SHA-256 预哈希,或评估 Argon2id。

Bcrypt 生成器常见问题

在线 bcrypt 生成器使用起来安全吗?
用这个工具是安全的——因为你输入的任何内容都不会离开浏览器。密码、生成的哈希以及验证过程全部在你自己设备上的 JavaScript 中本地运行。没有网络请求、没有日志、也没有存储:你可以在生成哈希时打开浏览器开发者工具(F12 → 网络选项卡)确认外发请求为零,或者断开网络连接后观察工具仍能正常工作。这与那种把你的密码 POST 到服务器的可疑生成器恰恰相反。作为习惯,在只是试验时仍建议使用一次性测试密码,而非真实的生产密码。
如何在线生成 bcrypt 哈希?
打开「生成」选项卡,输入密码(或点击「随机密码」生成一个强密码),挑选一个成本因子——12 是现代默认值——再选择版本前缀:$2b$ 适用于大多数现代技术栈,$2y$ 对应 PHP 和 Apache,$2a$ 则是最初的标识符。bcrypt 哈希会在你的浏览器中用全新的随机盐值即时计算,并以单个 60 字符的 $2b$12$... 字符串呈现,可一键复制。任何内容都不会上传:密码和哈希绝不会离开你的设备。随时再次生成即可为同一密码得到另一个有效哈希,因为每个哈希都带有不同的随机盐值。
bcrypt 哈希能被解密或逆向吗?
不能。bcrypt 是单向密码哈希函数,而非加密,因此不存在密钥,也没有能把哈希还原为原始密码的解密操作。从哈希得知密码的唯一办法是猜测候选值并逐个哈希直到匹配——而这正是 bcrypt 可调成本因子刻意设计成缓慢且昂贵的目的。这也是为什么你要用密码验证哈希,而不是解密它:工具用哈希中存储的盐值和成本对候选密码重新哈希,再检查结果是否完全相同。
我应该使用多大的成本因子(工作因子)?
成本 12 是现代默认值,也是安全性与速度的合理平衡。成本是对数级的工作因子:每加 1 就让内部轮数翻倍,因此成本 13 的计算和验证耗时约为成本 12 的两倍,而成本 11 只需一半时间。更高的成本会拖慢攻击者对泄露哈希的暴力破解,但也会给每次合法登录增加延迟,所以不要把它提高到在你实际硬件上认证明显变慢的程度。成本 10 适用于低风险接口;12 到 14 适合任何敏感场景。有效范围是 4 到 31,本工具允许你选择 4 到 15。
$2a$、$2b$ 和 $2y$ 有什么区别?
它们是同一 bcrypt 算法的版本前缀,差异源于历史上某些实现处理字符串长度和高位字符时的 bug 修复。$2a$ 是最初被广泛使用的标识符;$2b$ 是修正后的当前版本,bcryptjs 库和大多数现代实现都生成它;$2y$ 则是 PHP 和 Apache htpasswd 使用的标识符。就验证而言它们可以互换——你在这里用任意前缀生成的哈希都能在各个库中正确验证,因为它们运行的是同一套核心函数。如果你需要逐字节兼容,请选择你技术栈所期望的前缀。
如何用密码验证一个 bcrypt 哈希?
切换到「验证」选项卡,粘贴存储的 bcrypt 哈希(完整的 $2b$12$... 字符串)和候选密码,工具会立即告诉你它们是否匹配。它的原理是提取哈希中内嵌的盐值和成本,用这些完全相同的参数对候选密码重新哈希,再将新摘要与存储的摘要比对——其中不涉及任何解密。登录系统正是这样校验密码的:它从不还原明文,只确认对提交的密码重新哈希能复现出存储的哈希。
bcrypt、Argon2 还是 scrypt——我该用哪个?
这三者都是刻意设计得很慢、带盐的密码哈希函数,全都远比用裸 SHA-256 存储密码要好。bcrypt 支持最广、经受过最多实战检验,有简单可调的成本;它的主要限制是 72 字节的密码上限以及仅受 CPU 约束。scrypt 增加了内存硬度,使大规模 GPU/ASIC 攻击成本更高。Argon2(特别是 Argon2id)是密码哈希竞赛和 OWASP 当前的推荐,可独立调节时间、内存和并行度。如果今天从头选择,Argon2id 是最强的默认选项;而 bcrypt 仍是出色且安全的选择——尤其在看重库支持或互操作性的场景。我们在 bcrypt vs Argon2 vs scrypt 中深入剖析了各自的取舍。
为什么 bcrypt 哈希每次都不一样?
因为 bcrypt 为每次哈希生成一个全新的随机盐值,并在哈希前将盐值混入。因此同一密码每次点击「生成」都会产生一个完全不同的 60 字符字符串——而这正是关键所在:它能阻止攻击者预先计算彩虹表,也避免暴露两个用户共用同一密码的事实。盐值并非机密;它就存储在哈希内部(成本之后的那 22 个字符),因此验证时能把它读取出来。如果你重新生成哈希,只是得到同一密码的另一个有效哈希,而它们每一个都能验证成功。

JWT 解码器 · 在线解码工具

安全工具

免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。

JWT 编码器与生成器

安全工具

免费在线 JWT 生成器与编码器。构建头部和载荷,使用 HS256、RS256 或 ES256 即时签名。100% 浏览器本地运行——你的密钥和私钥绝不离开设备。

在线 MD5 哈希生成器与文件校验工具

安全工具

在线生成 MD5、SHA-256、SHA-1、SHA-512 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。

随机密码生成器 — 自定义长度、强度与安全性

安全工具

免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。

SHA-1 哈希生成器(160 位遗留算法)

安全工具

在浏览器中生成 SHA-1 哈希值 — 40 字符十六进制输出,无需上传。适用于 Git 指纹查询、旧证书核验和迁移审计的遗留工具。数据绝不离开你的设备。

SHA-256 哈希生成器与校验和工具

安全工具

免费在线生成 SHA-256 哈希值。在浏览器中对文本或文件进行哈希、验证校验和,复制 64 字符十六进制输出。无需注册,数据不离开页面。