微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rawPassword 和 encodingPassword 都使用 BcryptPasswordEncoder 作为相同的字符串出现

如何解决rawPassword 和 encodingPassword 都使用 BcryptPasswordEncoder 作为相同的字符串出现

我是 Spring Security 的新手。我使用 Spring boot、spring security 和 JWT 来保护 React 应用程序的身份验证。我收到以下错误

"o.s.s.c.bcrypt.BCryptPasswordEncoder [0;39m [2m:[0;39m 编码的密码看起来不像 BCrypt"

在使用 BcryptPasswordEncoder 时在控制台中。当我切换到 NoOpPasswordEncoder 时,它工作正常。我在 BCryptPasswordEncoder.class 中添加了断点。我在 encode() 和matches() 方法的入口处添加了断点。 BcryptPasswordEncoder 类中使用的 BCRYPT_PATTERN 是:

private Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2(a|y|b)?\\$(\\d\\d)\\$[./0-9A-Za-z]{53}");

在调试期间,我发现在 encode() 方法中 rawPassword 是 userNotFoundPassword,在matches 方法中 rawPassword 和 encodingPassword 都是相同的字符串(与用户输入的密码相同)。由于 rawPassword 和 encodingPassword 都与用户输入的密码相同,因此在以下条件检查中失败,并在控制台中抛出警告消息,然后验证失败。

if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
            this.logger.warn("Encoded password does not look like BCrypt");
            return false;
        }

userNotFoundPassword 在 encode() 方法中作为 rawPassword 出现

enter image description here

rawPassword 和encodedPassword 在matches() 方法中都作为相同的字符串出现

enter image description here

我不知道为什么会发生这种情况。有人可以帮忙吗?

解决方法

当您匹配的密码不是 bcrypt 散列时,会记录此警告。

一个 bcrypt 散列字符串看起来像:

$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG

例如,您可以看到前 3 个字符 ($2a) 在正则表达式中,因为这些字符表示正在使用的 bcrypt 版本。

很可能您正在获取并尝试匹配的密码没有使用 bcrypt 进行哈希处理,因此请检查您的数据库,这些密码在静态时是什么样的。

如果它们是纯文本,那么在尝试对它们进行匹配之前,您需要散列密码并将它们存储在数据库中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。