Grails 使用spring security对密码进行编码时出现问题

Grails 使用spring security对密码进行编码时出现问题,grails,spring-security,Grails,Spring Security,我使用的是grails 2.3.0,在使用spring security编码密码时遇到了一个奇怪的问题: 这是我的密码编码方法: String encodePassword(String password) { return springSecurityService.encodePassword(password) } 像那样使用 log.debug encodePassword("mkb") log.debug encodePassword("mkb") log.debug enc

我使用的是grails 2.3.0,在使用spring security编码密码时遇到了一个奇怪的问题:

这是我的密码编码方法:

String encodePassword(String password) {
    return springSecurityService.encodePassword(password)
}
像那样使用

log.debug encodePassword("mkb")
log.debug encodePassword("mkb")
log.debug encodePassword("mkb")
我多次对同一密码进行编码,每次都得到不同的编码密码

日志:


那很好。看起来您使用的是BCrypt密码散列,此算法在每次编码密码时都使用随机salt(其他散列算法使用“salt源属性”,如id)。这盐是预先准备好的

所以你有:

  • $2a
    -盐版
  • 10美元
    -轮
  • $h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K
    -Base64表示salt+哈希,其中salt获取前24个字符,哈希获取其余字符:
    • h8T4BxgOeozmH/VSPJl7NeTaF
      -salt
    • 2poionpsdqdn7ddffag.sy8WG/8K
      -散列(10轮salt+密码)
请参阅Spring Security的BCrypt来源:

如果需要手动检查用户密码,则必须使用
passwordEncoder
,如:

//dependency injection
def passwordEncoder

//validate
String enteredPassword = params.password
User user = ...
if (!passwordEncoder.isPasswordValid(user.password, enteredPassword, null)) { //validates raw password against hashed
   //... wrong password entered
}

你为什么要这么做?密码经过哈希处理,您可以登录,这还不够吗?我正在实施密码重置功能,需要使用用户输入的当前密码检查当前保存的密码。谢谢@Igor和@Burt
passwordEncoder.matches在我的情况下不起作用(我已经注入了passwordEncoder bean),可能是我做错了什么
passwordEncoder.isPasswordValid(encodePassword('mkb'),'mkb',null)
提供了所需的结果。很抱歉,刚刚发现
匹配的
来自SS版本3.1。该插件使用SS3.0。顺便说一句,
passwordEncoder.isPasswordValid(encodePassword('mkb'),'mkb',null)
与存储的密码不相比较,也许你的意思是
passwordEncoder.isPasswordValid(user.password,'mkb',null)
?是的,我的意思是
passwordEncoder.isPasswordValid(user.password,'mkb',null)
passwordEncoder.isPasswordValid(encodePassword('mkb'),'mkb',null)
仅用于测试。再次感谢。
//dependency injection
def passwordEncoder

//validate
String enteredPassword = params.password
User user = ...
if (!passwordEncoder.isPasswordValid(user.password, enteredPassword, null)) { //validates raw password against hashed
   //... wrong password entered
}