尝试将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。
尽管新的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/