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.encodePasswordisPasswordValid(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 集成