我在尝试使用 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/