7

我正在使用 grails 2.3.0 并在使用 spring security 对密码进行编码时遇到了奇怪的问题:

这是我对密码进行编码的方法:

String encodePassword(String password) {
    return springSecurityService.encodePassword(password)
}

并像那样使用

log.debug encodePassword("mkb")
log.debug encodePassword("mkb")
log.debug encodePassword("mkb")

我多次编码相同的密码,每次我得到不同的编码密码。

日志:

$2a$10$h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K
$2a$10$a7qybaiLF/eNrTSwFohjkezNaJTTDdMEinRYKjxDzEt.OoxaIgFOu
$2a$10$nZVhUT0QTmmbtt22CPtM..cLxU252RGBIMkd5aSd2AFXNTNLQ./6u
4

2 回答 2

14

没关系。看起来您正在使用 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
}
于 2013-10-21T15:23:36.377 回答
0

Grails spring security 描述了更新密码的过程:https ://grails-plugins.github.io/grails-spring-security-core/4.0.x/index.html

    User user = User.findByUsername(username)
   if (!passwordEncoder.matches(password, user.password)) {
      flash.message = 'Current password is incorrect'
      render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
      return
   }

   if (passwordEncoder.matches(password_new, user.password)) {
      flash.message = 'Please choose a different password from your current one'
      render view: 'passwordExpired', model: [username: session['SPRING_SECURITY_LAST_USERNAME']]
      return
   }

其中 password 或 new_password 是参数或方法参数

于 2021-08-16T13:22:39.580 回答