编码与安全指南

bcrypt 长度限制:先数 UTF-8 字节再哈希

用 Unicode 样例测试 72 字节边界,避免旧实现静默截断密码。

Nav Tools ·

数的是字节而非显示字符

很多 bcrypt 实现只处理前 72 个输入字节,Unicode 字符可能需要多个 UTF-8 字节。

字符计数不能可靠执行该限制,需要按密码库实际使用的编码检查字节。

new TextEncoder().encode('中'.repeat(24)).length → 72
new TextEncoder().encode('中'.repeat(25)).length → 75

应拒绝而非静默截断

本站在哈希与比较前拒绝超过 72 UTF-8 字节的密码,使边界在测试中可见。

旧服务若静默截断,前 72 字节相同的两个密码可能得到相同验证结果,应检查线上实现。

不要临时发明预哈希迁移

预哈希改变密码存储方案及安全假设,临时补丁与现有 bcrypt 记录未必兼容。

使用经过审查的密码存储设计和明确迁移策略,并随记录保存算法标记。

成本与兼容性分开测试

成本参数改变计算量,不改变输入字节限制,提高成本不能解决截断歧义。

本站提供 8、10、12 的交互成本选项;生产参数应结合服务器测量和当前密码存储指南选择。

参考资料

← 编码与安全指南