rawpassword和encodedpassword都使用bcryptpasswordencoder作为相同的字符串

a0x5cqrl  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(254)

我是新来的Spring安全。我使用了SpringBoot、SpringSecurity和jwt来保护react应用程序的身份验证。我得到以下错误:
“o.s.s.c.bcrypt.bcryptpasswordencoder[0;39m[2m:[0;39m编码的密码看起来不像bcrypt“
在控制台中使用bcryptpasswordencoder时。当我切换到nooppasswordencoder时,它工作得很好。我在bcryptpasswordencoder.class中添加了断点。我在encode()和matches()方法的入口添加了断点。bcryptpasswordencoder类中使用的bcrypt_模式为:

private Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2(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()方法中都是同一个字符串

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

r7xajy2e

r7xajy2e1#

当您匹配的密码未进行bcrypt哈希运算时,会记录此警告。
bcrypt哈希字符串类似于:

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

例如,您可以看到前3个字符($2a)在regexp中,因为这些字符表示正在使用的bcrypt版本。
很可能您正在获取并试图匹配的密码没有使用bcrypt散列,因此请检查您的数据库,了解密码在静止时的样子。
如果密码是纯文本的,那么您需要对密码进行散列,并将其存储在数据库中,然后再尝试对其进行匹配。

相关问题