2 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
問(wèn)題是它的每次加密每次都不一樣,所以它永遠(yuǎn)無(wú)法與數(shù)據(jù)庫(kù)中的相匹配。
這是正常的 bcrypt 行為。
bcrypt 每次都返回不同的散列,因?yàn)樗鼘⒉煌碾S機(jī)值合并到散列中。這被稱為“鹽”。它可以防止人們使用“彩虹表”攻擊您的散列密碼,這是一個(gè)預(yù)先生成的表,將密碼散列映射回他們的密碼。salt 意味著密碼不是一個(gè)散列,而是 2^16 個(gè)。太多無(wú)法存儲(chǔ)。
鹽作為散列密碼的一部分存儲(chǔ)。因此bcrypt.CompareHashAndPassword(encryptedPassword, plainPassword)
可以plainPassword
使用相同的鹽進(jìn)行加密encryptedPassword
并進(jìn)行比較。
我在這里做錯(cuò)了什么?
您正在嘗試將生成的散列密碼與存儲(chǔ)的散列密碼進(jìn)行比較。至少我當(dāng)然希望它是存儲(chǔ)在數(shù)據(jù)庫(kù)中的散列密碼。
相反,您想要的是將存儲(chǔ)的散列密碼與用戶輸入的普通密碼進(jìn)行比較。
// 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)
}

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
bcrypt散列算法在設(shè)計(jì)上會(huì)在您每次調(diào)用它時(shí)生成一個(gè)不同的加密字符串(它是加鹽的)。如果您有要檢查的明文密碼和數(shù)據(jù)庫(kù)中的密文,您應(yīng)該能夠?qū)⑦@兩件事傳遞給bcrypt.CompareHashAndPassword
.?調(diào)整您的代碼:
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))
您不需要bcrypt.GenerateFromPassword再打電話;正如您所注意到的,它將生成一個(gè)不同的加密密碼,并且?guī)缀醪豢赡鼙容^兩者是否相等。
- 2 回答
- 0 關(guān)注
- 934 瀏覽
添加回答
舉報(bào)