我正在使用 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")
我对同一个密码进行了多次编码,每次都得到不同的编码密码。
logs:
$2a$10$h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K
$2a$10$a7qybaiLF/eNrTSwFohjkezNaJTTDdMEinRYKjxDzEt.OoxaIgFOu
$2a$10$nZVhUT0QTmmbtt22CPtM..cLxU252RGBIMkd5aSd2AFXNTNLQ./6u
没关系。看起来您正在使用 BCrypt 密码哈希,该算法在每次编码密码时使用随机盐(其他哈希算法使用“盐源属性”,如 id)。该盐被添加到哈希值之前
所以你有了:
-
$2a
- 盐版本
-
$10
- 回合
-
$h8T4BxgOeozmH/VSPJl7NeTaF2P0iONpSdqDN7dDFFAG.sy8WG/8K
- Base64 for salt+hash, where salt get first 24 characters, and hash takes the rest:
-
h8T4BxgOeozmH/VSPJl7NeTaF
- salt
-
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 https://github.com/spring-projects/spring-security/blob/master/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java
如果您需要手动检查用户密码,则必须使用passwordEncoder
, like:
//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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)