🔑 bcrypt哈希
密码哈希 · 盐轮数可调 · 验证匹配
密码哈希 · 盐轮数可调 · 验证匹配
bcrypt是一种专为密码存储设计的哈希算法,基于Blowfish加密算法,内置salt(盐)和可调节的迭代(成本因子),能有效抵御彩虹表和暴力破解攻击。
轮数越高越安全,但计算时间也越长。4-8适合快速测试,10-12适合一般应用,12-16适合高安全场景。轮数每增加1,计算时间翻倍。
SHA256等通用哈希算法极快,攻击者可以每秒尝试数十亿次。bcrypt故意设计为慢速算法,且每个密码用不同的盐,是密码存储的最佳实践。
形如 $2a$10$由几段组成:$2a(或$2b/$2y)表示版本,10是成本因子,接着22字符是用自定义Base64编码的盐,最后31字符是哈希主体。验证时从哈希里取出盐和轮数重新计算比对。
$2a是最早广泛使用的版本;$2b修复了长密码(超过72字节)的一个长度处理bug,是PHP等语言的推荐版本;$2y是某些PHP旧版本对$2a的兼容别名。它们都能互相验证,但新项目建议用$2b。
有。bcrypt只处理密码的前72字节,超过的部分会被截断忽略。所以别依赖超长密码的安全增益,更好的做法是配合最少8-12位、大小写数字符号混合的密码策略。
因为每次生成都会随机产生一个不同的盐。盐不同,哈希自然不同。验证时工具会自动从哈希里读出盐来重算,所以验证用的是"比对"而不是"加密后再比较"。
三者的思路一致:慢哈希+盐。argon2是2015年后推出的最新内存硬性算法,抗GPU/ASIC破解更强,是新一代推荐;scrypt强调内存占用。bcrypt最成熟、支持最广,依然是完全合格的选择。
bcrypt源自Blowfish分组密码的密钥扩展过程(eksblowfish),把密码当作密钥,反复执行2^cost轮复杂运算。
成本因子每加1,运算次数翻倍。成本因子10=1024次,14=16384次,因子20以上对普通CPU来说要算很久。
关键在于"不对称":合法用户验证一次只需几百毫秒,但攻击者要猜密码就要每次都付出同样代价,暴力破解的吞吐量被压到极低。
| 成本因子 | 迭代次数 | 普通CPU耗时 |
|---|---|---|
| 4 | 16次 | <1毫秒 |
| 8 | 256次 | 约几毫秒 |
| 10 | 1024次 | 约50-100毫秒 |
| 12 | 4096次 | 约200-400毫秒 |
| 14 | 16384次 | 约800毫秒-1秒 |
盐是一个随机生成的字符串,和密码一起参与哈希计算。没有盐会出现两个问题:
| 方案 | 是否推荐 | 原因 |
|---|---|---|
| 明文存储 | 绝对不行 | 一旦数据库泄露全部密码裸露 |
| MD5/SHA256 | 不行 | 太快且无盐,秒破 |
| MD5+固定盐 | 不行 | 盐固定等于没盐 |
| bcrypt/scrypt/argon2 | 推荐 | 慢哈希+随机盐 |
此外还要配合:注册时校验密码强度、登录时用恒定时间比较、定期评估成本因子、密码泄露后强制重置。
一个完整bcrypt哈希长这样:$2b$10$N9qo8uLOickgx2ZMRZoMyeIvK8QW9UEyD0X9vJ9vQzL8Z0N0wQ====
| 算法 | 输出长度 | 是否有盐 | 速度 | 密码存储 |
|---|---|---|---|---|
| MD5 | 128位(32字符) | 可加 | 极快 | 不推荐 |
| SHA-256 | 256位(64字符) | 可加 | 快 | 不推荐 |
| bcrypt | 60字符 | 内置随机盐 | 慢 | 推荐 |
| scrypt | 可配置 | 内置 | 慢 | 推荐 |
| argon2 | 可配置 | 内置 | 慢 | 新一代推荐 |
| 分段 | 含义 | 示例 |
|---|---|---|
| $2b$ | 版本标识 | $2b$ |
| 10 | 成本因子 | 10 |
| 22字符 | 盐(Base64) | N9qo8uLOickgx2ZMRZoMyeI |
| 31字符 | 哈希主体 | vK8QW9UEyD0X9vJ9vQzL8Z0N0wQ |
1. 输入密码。
2. 调整盐轮数(默认10)。
3. 点击"生成Hash"生成bcrypt哈希。
4. 也可以用"验证Hash"功能检查密码和已有hash是否匹配。