rawPassword 和 encodedPassword 都使用 BcryptPasswordEncoder 作为同一个字符串出现

rawPassword and encodedPassword both are coming as same string using BcryptPasswordEncoder

我是 spring 安全方面的新手。我已经使用 Spring 引导、spring 安全和 JWT 来保护 React 应用程序的身份验证。我收到以下错误:

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

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

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

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

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

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

rawPassword 和 encodedPassword 在 matches() 方法中都是同一个字符串

我不知道为什么会这样。有人可以帮忙吗?

当您匹配的密码未经过 bcrypt 哈希处理时,会记录此警告。

bcrypt 哈希字符串类似于:

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

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

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

如果它们是纯文本,那么您需要对密码进行哈希处理并将它们存储在数据库中,然后再尝试对它们进行匹配。