我正在尝试在使用Spring Security插件的Grails应用程序中使用BCrypt密码哈希。 我通过在Config.groovy添加以下内容来启用BCrypt

grails.plugins.springsecurity.password.algorithm = 'bcrypt'

我已经定义了以下编解码器来简化使用BCrypt来编码密码:

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编码值会发生某种变化随着时间的推移。

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

===============>>#1 票数:9 已采纳

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

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

  ask by Dónal translate from so

未解决问题?本站智能推荐:

1回复

使用spring-security-bcrypt插件在Grails中进行bcrypt集成

我想在我的grails项目中使用bcrypt哈希算法,而不是其默认的SHA-256消息摘要算法。 要启用bcrypt,只需使用grails install-plugin spring-security-bcrypt命令。 您可以通过将其添加到BuildConfig.groovy来自定义密
1回复

配置Spring Boot Security以在Grails 3.0中使用BCrypt密码编码

在Grails 3.0中,如何指定Spring Boot Security应该使用BCrypt进行密码编码? 以下几行应该提供我认为需要做的事情(但我大多只是猜测): 我的应用程序将spring-boot-starter-security作为依赖项加载: 的build.gra
1回复

使用Spring Security Grails插件编码密码

在我的Grails 2.5.1项目中,我使用的是spring-security-core:2.0-RC5插件,并收到以下错误消息: 这是我的BootStrap: 我有什么想念的吗?
1回复

使用Spring Security在不重新编码所有密码的情况下为实时Grails应用程序增加BCrypt logrounds是否安全?

这个问题是针对使用带有BCrypt配置的Spring Security的生产Grails应用程序的。 为了跟上不断提高的服务器CPU速度,我想提高grails.plugin.springsecurity.password.bcrypt.logrounds属性的值,以便密码散列花费的时间更长
1回复

为Grails / Spring Security REST用户手动计算bcrypt“哈希”(并保存在db中)

我需要在数据库中批量设置数百个密码。 虽然我意识到我可以编写某种服务来通过Grails,但是要求我严格使用SQL进行更新。 我的意思不是说我需要使用一些数据库内置的crypto()或password()函数,我只是说user.password字段的覆盖应该是SQL可编写脚本的。 并且出
2回复

使用Grails Spring Security插件登录的其他字段

我的问题与此类似 如何在Spring Security登录页面中传递附加参数 尽管适用于Grails Spring Security插件。 如果我必须在登录名(公司名称)中支持其他字段,如何在Grails中做到这一点? 我将从URL获得公司名称字段。 例如。 / lo
1回复

在Grails中使用Spring-Security插件时出错

我一直在尝试在我的grails应用程序中集成spring-security。 如弹簧安全性教程中所述,我使用以下代码安装了插件 BuildConfig.groovy:我添加了以下代码 后来,我清理了代码并进行了编译,以确保下载了依赖项。 我还检查了.grails文件夹,以确保下
3回复

Grails Spring Security插件和dbconsole

我使用grails 2.4.3并安装了官方grails安全插件 在安装插件之前,我可以使用url访问数据库控制台页面 但是,安装插件后,我无法这样做。 当我尝试访问上面提到的URl并通过任何用户帐户登录时,我得到默认登录屏幕显示“访问被拒绝”页面。 我该如何解决这个问题?
1回复

Grails 3 Spring安全性插件

我正在使用Grails 3和Spring Security插件进行身份验证。 当我在浏览器中手动点击以下网址时: http:// localhost:8080 / cool-0.1 / 我得到了登录页面,我可以成功进行身份验证,这表明我正确输入了用户名/密码组合。 问题:
3回复

Grails内联插件和Spring安全

我正在使用插件将grails应用程序分解为模块,然后将内联插件位置添加到BuildConfig.groovy。 现在我有一个名为'admin'的grails应用程序和一个名为'common'的插件。 'common'插件包含我所有的共享域对象,并且还安装了spring-security-