尝试将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

尽管新的PasswordEncoder在org.springframework.security.crypto.password中,但是BCryptPasswordEncoder中的导入看起来是错误的。

进行passwordEncoder.isPasswordValid(rawPassword, encodedPassword, null)可以正常工作(例如,没有错误),但是我不知道如何撒盐。

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

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

最佳答案

如错误所示,您不能在bcrypt中使用盐。没关系-该算法非常健壮,就像已经在使用盐一样。

盐的重点是确保您和我使用相同的密码,而我们没有相同的哈希密码(假设我们每个人都有自己的盐值)。未加盐的密码无法散列,但是可以为所有密码组合创建一个哈希表,直到一定长度,然后将其用作查找以查找给定哈希值的明文密码。在Internet上搜索“彩虹表”,您将找到具有针对MD5,SHA-1和其他算法的查找表的站点。

如果您使用bcrypt使用零盐值运行encodePassword,则每次运行都会得到一个不同的哈希字符串。使用较简单算法的isPasswordValid方法实现通常使用提供的盐对明文密码进行哈希处理(如果存在的话),并检查该值是否与存储的哈希值相同。但是使用bcrypt还是不够的,因此它具有逻辑来验证它们是否相等,但不一定相等。

该插件混合使用了两个接口(interface)的实现以实现向后兼容性,并且在将来的版本中将不再支持旧接口(interface)。

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

10-11 20:18