尝试使用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
答案 0 :(得分:0)
如错误所示,您不能将盐与bcrypt一起使用。虽然这很好 - 算法非常强大,就好像它已经使用了盐一样。
盐点是为了确保如果你和我有相同的密码,我们没有相同的哈希密码(假设我们每个人都有自己的盐值)。无法删除未加密码的密码,但是可以为所有密码组合创建一个哈希表,直到一定长度,并将其用作查找以查找给定哈希值的明文密码。在互联网上搜索“彩虹表”,你会发现有MD5,SHA-1和其他算法的查找表的网站。
如果使用bcrypt运行带有空值的encodePassword
,则每次运行都会获得不同的哈希字符串。使用简单算法的isPasswordValid
方法实现通常会使用提供的盐(如果有的话)散列明文密码,并检查此值是否与存储的哈希值相同。但是使用bcrypt是不够的,所以它有逻辑来验证它们是等价的,但不一定相等。
该插件使用两个接口的混合实现向后兼容性,并将在未来版本中放弃对旧接口的支持。