使用golang.org/x/crypto/bcrypt
和GORM(http://gorm.io/docs/)我正在尝试加密密码。问题在于,每种加密方式每次都不同,因此它永远无法与数据库中的加密方式匹配。
var result []string
password := []byte(data.Password)
encryptedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) // different every time
db.Where(&User{Username: strings.ToLower(data.Username)}).First(&user).Pluck("password", &result)
encryptionErr := bcrypt.CompareHashAndPassword(encryptedPassword, []byte(result[0]))
if encryptionErr == nil { // passwords match! }
Run Code Online (Sandbox Code Playgroud)
我已经确认每次输入都是相同的,并且数据库提供的密码是正确的。
我在这里做错了什么?
该bcrypt哈希算法,通过设计,生成每次调用它(这是一次不同的加密字符串咸)。如果您有要检查的明文密码和数据库中的密文,您应该能够将这两件事传递给bcrypt.CompareHashAndPassword
. 调整您的代码:
var result []string
db.Where(&User{Username: strings.ToLower(data.Username)})
.First(&user)
.Pluck("password", &result)
encryptionErr := bcrypt.CompareHashAndPassword([]byte(result[0]), []byte(data.Password))
Run Code Online (Sandbox Code Playgroud)
你应该不需要bcrypt.GenerateFromPassword
再次打电话;正如您所注意到的,它会生成一个不同的加密密码,并且几乎不可能比较两者是否相等。
问题在于,每种加密方式每次都不同,因此它永远无法与数据库中的加密方式匹配。
这是正常的bcrypt行为。
bcrypt每次都会返回一个不同的哈希,因为它会将不同的随机值合并到哈希中。这就是所谓的“盐”。它可以防止人们使用“彩虹表”来攻击您的哈希密码,该彩虹表是一个预先生成的将密码哈希映射回其密码的表。盐表示,密码不是2个哈希值,而是1个哈希值。存储太多。
盐作为哈希密码的一部分存储。因此bcrypt.CompareHashAndPassword(encryptedPassword, plainPassword)
可以plainPassword
使用相同的盐加密encryptedPassword
并进行比较。
有关更多信息,请参阅此答案,以及Dustin Boswell出色的安全存储用户密码:哈希,加盐和Bcrypt。
我在这里做错了什么?
您正在尝试将生成的哈希密码与存储的哈希密码进行比较。至少我当然希望它是存储在数据库中的哈希密码。
相反,您想要将存储的哈希密码与用户输入的普通密码进行比较。
// Normally this comes from user input and is *never* stored
plainPassword := "supersekret"
// The encrypted password is stored in the database
db.Where(&User{Username: strings.ToLower(data.Username)}).First(&user).Pluck("password", &result)
encryptedPassword := []byte(result[0])
// Check if the stored encrypted password matches "supersekret"
encryptionErr := bcrypt.CompareHashAndPassword(encryptedPassword, plainPassword)
if encryptionErr == nil {
fmt.Println("Greetings Professor Falken")
} else {
fmt.Println(encryptionErr)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1147 次 |
最近记录: |