在Spring Security Grails插件中使用BCrypt密码哈希

在Spring Security Grails插件中使用BCrypt密码哈希,grails,spring-security,grails-plugin,bcrypt,Grails,Spring Security,Grails Plugin,Bcrypt,我试图在使用Spring安全插件的Grails应用程序中使用BCrypt密码哈希。我通过在Config.groovy grails.plugins.springsecurity.password.algorithm = 'bcrypt' 我定义了以下编解码器,以简化使用BCrypt对Pasword进行编码的过程: public class PasswordCodec { // it doesn't seem to be possible to dependency-inject co

我试图在使用Spring安全插件的Grails应用程序中使用BCrypt密码哈希。我通过在
Config.groovy

grails.plugins.springsecurity.password.algorithm = 'bcrypt'
我定义了以下编解码器,以简化使用BCrypt对Pasword进行编码的过程:

public class PasswordCodec {

    // it doesn't seem to be possible to dependency-inject codecs, so lookup the bean ourselves
    @Lazy
    private static PasswordEncoder passwordEncoder = Holders.grailsApplication.mainContext.getBean('passwordEncoder')

    static encode = { str ->
        passwordEncoder.encodePassword(str.toString(), null)
    }
}
当我在开发模式下启动应用程序时,数据库将使用几个帐户(每个帐户都有相同的密码,例如

3.times { i ->
    def username = "user$i"
    def password = "secret".encodeAsPassword()

    new User(username: username, password: password).save()
    // also assign the user a role
}
如果我查看数据库,我会发现每个用户密码的编码值都是不同的!因此,当用户尝试登录并输入“secret”密码时,毫不奇怪,BCrypt编码的密码值与数据库中保存的密码值不匹配,因为字符串的BCrypt编码值似乎会随着时间的推移而发生变化


很明显,我在这里做错了什么,但我不知道是什么?

对于相同的输入,密码哈希值通常是相同的(并且偶尔使用不同的输入)但是bcrypt和其他人每次都会生成不同的散列。但是,这不是问题,因为
PasswordEncoder
接口既有
String encodepass(String rawPass,Object salt)
方法来生成散列,也有
boolean isPasswordValid(String encPass,String rawPass,Object salt)
验证它们的方法


对于MD5、SHA-1等更简单的散列,验证过程只需重新编码明文密码并检查它是否与存储的散列值相同。使用bcrypt的过程要复杂得多,但最终结果是相同的-它不检查是否相等,而是检查它们是否相等。因此,如果对相同的密码两次,并与
isPasswordValid
进行比较,它将返回
true

我假设您的用户域没有处理密码编码的典型s2快速启动代码?此外,我认为salting现在默认启用,它基于用户名,因此每个密码的salts不同:。。。假设您仍然有生成的s2快速启动代码。@Joshuamore不,我没有在用户类本身中进行任何密码编码(我没有使用s2快速启动)@Joshuamore我自己在
PasswordCodec
中对密码进行编码,然后将salt参数的
null
传递给salt,这完全奇怪。也许伯特会路过并提供一些帮助。我看不出你所做的有任何明显的错误,它模仿了我们在春天以前所做的。这个不推荐使用的PasswordEnco是怎么回事与此不同的是,除了在前一种情况下由用户提供salt之外?(毫无疑问),我还没有仔细研究差异,但我正计划迁移到较新的界面。@BurtBeckwith我完全错过了
isPasswordValid
方法,非常感谢