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

时间:2014-11-04 12:44:28

标签: spring grails spring-security

尝试使用spring-security-core:2.0-RC4Grails 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

1 个答案:

答案 0 :(得分:0)

如错误所示,您不能将盐与bcrypt一起使用。虽然这很好 - 算法非常强大,就好像它已经使用了盐一样。

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

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

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