编码与安全指南
bcrypt 长度限制:先数 UTF-8 字节再哈希
用 Unicode 样例测试 72 字节边界,避免旧实现静默截断密码。
数的是字节而非显示字符
很多 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 的交互成本选项;生产参数应结合服务器测量和当前密码存储指南选择。