我是新来的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()方法中都是同一个字符串
我不知道为什么会这样。有人能帮忙吗?
1条答案
按热度按时间r7xajy2e1#
当您匹配的密码未进行bcrypt哈希运算时,会记录此警告。
bcrypt哈希字符串类似于:
例如,您可以看到前3个字符($2a)在regexp中,因为这些字符表示正在使用的bcrypt版本。
很可能您正在获取并试图匹配的密码没有使用bcrypt散列,因此请检查您的数据库,了解密码在静止时的样子。
如果密码是纯文本的,那么您需要对密码进行散列,并将其存储在数据库中,然后再尝试对其进行匹配。