spring security 使用 bcrypt 算法对密码进行编码

Posted

技术标签:

【中文标题】spring security 使用 bcrypt 算法对密码进行编码【英文标题】:spring security encode password with bcrypt algorithm 【发布时间】:2016-01-23 01:31:31 【问题描述】:

我得到了一些奇怪的东西......在春季安全编码密码......

我正在尝试更改我的密码并将其保存到数据库..但我总是收到错误,因为字符串不同..

像这样..

在控制器中..

println "password  = "+oldPass
println "password 1 = "+springSecurityService.encodePassword('password')
println "password 2 = "+springSecurityService.encodePassword('password')
println "password  = "+springSecurityService.encodePassword(oldPass)

还有这个输出

它很奇怪......每次我编码密码,我都会得到不同的结果。

我正在使用 grails 3.0.5 并使用 bcrypt 算法

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

我把这一行放在 application.groovy 中

喜欢这个

    // Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.akiong.security.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.akiong.security.UserRole'
grails.plugin.springsecurity.authority.className = 'com.akiong.security.Role'
grails.plugin.springsecurity.requestMap.className = 'com.akiong.security.RequestMap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/':                ['permitAll'],
    '/error':           ['permitAll'],
    '/index':           ['permitAll'],
    '/index.gsp':       ['permitAll'],
    '/shutdown':        ['permitAll'],
    '/assets/**':       ['permitAll'],
    '/**/js/**':        ['permitAll'],
    '/**/css/**':       ['permitAll'],
    '/**/images/**':    ['permitAll'],
    '/**/favicon.ico':  ['permitAll']
]
grails.plugin.springsecurity.password.algorithm = 'bcrypt'

但是当我使用引导程序创建用户帐户并将其保存到数据库时.. 然后我登录...它运行正确..

【问题讨论】:

顺便说一句,如果您将代码示例、输出等放在纯文本而不是图像中,对其他人来说会容易得多。所以它可以被引用,或者在回答之前用于实验 【参考方案1】:

这是一项功能bcrypt 使用随机盐,因此即使对于相同的密码,每次它都会生成不同的哈希值。

如果要检查输入的密码是否有效,Grails 需要使用passwordEncoder.isPasswordvalid,如:

assert passwordEncoder.isPasswordValid( 
       '$2a$10$Qb7ENpWOSsFUS2UvwT1BRefZhn55roXPgUI8fjJRm6c/nR3JIQP8a',
       'password', null)
assert passwordEncoder.isPasswordValid(
       '$2a$10$sC3.yrmNn2VLS2Aer359rei/DxoLlwFq7s6ndAHm10ncyQpIr3MfO',
       'password', null)

或者对于普通的 Spring Security passwordEncoder.matches

assert passwordEncoder.matches('password', 
       '$2a$10$Qb7ENpWOSsFUS2UvwT1BRefZhn55roXPgUI8fjJRm6c/nR3JIQP8a')
assert passwordEncoder.matches('password', 
       '$2a$10$sC3.yrmNn2VLS2Aer359rei/DxoLlwFq7s6ndAHm10ncyQpIr3MfO')

要自动装配 passwordEncoder bean,只需将其定义为您的类的属性:

def passwordEncoder

【讨论】:

println "password 1 = "+passwordEncoder.matches('password','$2a$10$JNUJ3pRiwnOMkVYPRpbdeujyuBLTavozVLinHRnf5MK8VHkif2IGG')... 我不能使用 passwordEncoder 您是否将其连接到您的服务/控制器/等?是spring提供的bean 怎么样?我不知道..我只是将这个 grails.plugin.springsecurity.password.algorithm = 'bcrypt' 添加到 application.groovy 哦,你的意思是调用 def springSecurityService 吗?我接线...这就是为什么我可以使用 springSecurityService.encodePassword isPasswordValid(hashed, plainpassword, salt)。 bcrypt 不能使用 salt,所以必须是 null

以上是关于spring security 使用 bcrypt 算法对密码进行编码的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 OAuth2 和 JWT 的 Spring Security:编码密码看起来不像 BCrypt

Spring Security bcrypt 编码登录不起作用

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

Spring Security:无法将我的 UserDetailService 自动连接到 AuthenticationProvider 以进行 BCrypt 集成

Spring Security