spring - BCryptPasswordEncoder.matches() 方法的签名不适用于参数类型 : (java. lang.String, java.lang.String)

标签 spring grails spring-security

我在尝试使用 spring-security-core:2.0-RC4 匹配用户密码时遇到问题与 Grails 2.3.3 .

执行 passwordEncoder.matches(rawPassword, encodedPassword) 时出现以下错误

No signature of method grails.plugin.springsecurity.authentication.encoding.BCryptPasswordEncoder.matches() is applicable for argument types: (java.lang.String, java.lang.String)

我检查了BCryptPasswordEncoder source寻找线索,最终在PasswordEncoder class definition .

BCryptPasswordEncoder中的导入虽然新的 PasswordEncoder 在 org.springframework.security.crypto.password 中,但看起来有问题.

passwordEncoder.isPasswordValid(rawPassword, encodedPassword, null)工作(如,没有错误),但我不知道如何得到盐。

这工作正常吗?如果是这样,我如何获得盐?

编辑:
我尝试使用 NullSaltSource也是,但它给了我错误:
Salt value must be null when used with crypto module PasswordEncoder

最佳答案

正如错误所说,您不能将盐与 bcrypt 一起使用。不过这很好 - 该算法非常健壮,并且就像它已经在使用盐一样。

加盐的目的是确保如果你和我有相同的密码,我们没有相同的散列密码(假设我们每个人都有自己的加盐值)。未加盐的密码不能被去散列,但可以为不超过一定长度的所有密码组合创建一个散列表,并将其用作查找给定散列的明文密码。在互联网上搜索“彩虹表”,您会发现有 MD5、SHA-1 和其他算法的查找表的站点。

如果你运行 encodePassword使用 bcrypt 的空盐值,每次运行都会得到不同的哈希字符串。 isPasswordValid使用更简单算法的方法实现通常使用提供的盐对明文密码进行散列(如果有),并检查该值是否与存储的散列相同。但是使用 bcrypt 是不够的,所以它有逻辑来验证它们是否相等,但不一定相等。

该插件使用两个接口(interface)的混合实现以实现向后兼容性,并将在 future 版本中放弃对旧接口(interface)的支持。

关于spring - BCryptPasswordEncoder.matches() 方法的签名不适用于参数类型 : (java. lang.String, java.lang.String),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26735469/

相关文章:

java - Spring Boot MockMvc 无法使用 @PathVariable 进行测试

Grails 在删除时重定向到另一个 View 或 Controller

java - Spring Security, session 超时后创建 session 而无需登录

java - 使用 spring-security-oauth2 的 SSO : Authentication Code never read

Java/ Spring : Beans for the View

java - 在java中向服务器发送请求后不等待响应

android - Grails Firebase 云消息传递插件

java - 将连续尾部输出重定向到 UI

java - Spring Security 加密字符串 - Go 中解密失败

java - @Cacheable 条件使用应用程序属性