You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BCrypt.checkpw验证加密密码返回false的原因是什么?

BCrypt密码验证返回false的原因分析

问题场景

我在用户表中存储了一条测试用户数据,密码是通过BCrypt加密的虚拟密码,加密代码如下:

System.out.println(BCrypt.hashpw("1234", BCrypt.gensalt()));
// 输出哈希值:$2a$10$IIAj7Ft6yGWk6I7bmYUzy.1UrtHVbX.N5z1CdfhG3GGpIib06oDv.

随后用BCrypt验证密码时返回false,验证代码:

System.out.println(BCrypt.checkpw("1234", "$2a$10$IIAj7Ft6yGWk6I7bmYUzy.1UrtHVbX.N5z1CdfhG3GGpIib06oDv."));
// 输出:false

可能的原因及解决办法

  • 手动复制哈希值出错:BCrypt的哈希值是固定60位的字符串,很容易在复制时不小心多打、漏打字符,或者带入空格、换行符。建议不要手动复制哈希值,而是用变量直接传递验证,比如:
String hashedPwd = BCrypt.hashpw("1234", BCrypt.gensalt());
System.out.println(hashedPwd);
System.out.println(BCrypt.checkpw("1234", hashedPwd)); // 此时应返回true

如果必须手动复制,仔细核对每一个字符,确保和加密输出完全一致。

  • BCrypt版本不兼容:不同BCrypt库的版本前缀(如$2a$、$2y$)处理逻辑可能有差异,若加密和验证用的是不同版本的库,可能导致验证失败。确认加密和验证使用的是同一个BCrypt依赖版本。

  • 字符串转义或编码问题:若哈希值是从HTML页面、带转义的日志中复制的,可能带有转义字符(比如原代码中的"是HTML转义的双引号),要确保验证时传入的是纯哈希值,不含任何转义符号。另外,确认密码字符串"1234"的编码和加密时一致(比如都是UTF-8),避免字节差异导致验证失败。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:30:51