使用spring security编码密码的问题

MKB*_*MKB 6 grails spring-security

我使用grails 2.3.0并在使用spring security编码密码时面临奇怪的问题:

这是我编码密码的方法:

String encodePassword(String password) {
    return springSecurityService.encodePassword(password)
}
Run Code Online (Sandbox Code Playgroud)

并使用那样的

log.debug encodePassword("mkb")
log.debug encodePassword("mkb")
log.debug encodePassword("mkb")
Run Code Online (Sandbox Code Playgroud)

我正在编码相同的密码几次,每次我得到不同的编码密码.

日志:

$2a$10$h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K
$2a$10$a7qybaiLF/eNrTSwFohjkezNaJTTDdMEinRYKjxDzEt.OoxaIgFOu
$2a$10$nZVhUT0QTmmbtt22CPtM..cLxU252RGBIMkd5aSd2AFXNTNLQ./6u
Run Code Online (Sandbox Code Playgroud)

Igo*_*nov 13

没关系.看起来你正在使用BCrypt密码哈希,每次编码密码时此算法都使用随机盐(其他哈希算法使用'盐源属性',如id).这个盐预先哈希

所以你有了:

  • $2a - 盐版
  • $10 - 轮
  • $h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K - 用于salt + hash的Base64,其中salt获得前24个字符,hash获取其余部分:
    • h8T4BxgOeozmH/VSPJl7NeTaF - 盐
    • 2P0iONpSdqDN7dDFFAG.sy8WG/8K - 哈希(盐+密码10轮)

请参阅Spring Security的BCrypt来源:https://github.com/spring-projects/spring-security/blob/master/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java

如果您需要手动检查用户密码,则必须使用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
}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么这么想?密码被哈希并且您可以登录是不够的? (4认同)