2 回答

TA貢獻1883條經驗 獲得超3個贊
問題是它的每次加密每次都不一樣,所以它永遠無法與數據庫中的相匹配。
這是正常的 bcrypt 行為。
bcrypt 每次都返回不同的散列,因為它將不同的隨機值合并到散列中。這被稱為“鹽”。它可以防止人們使用“彩虹表”攻擊您的散列密碼,這是一個預先生成的表,將密碼散列映射回他們的密碼。salt 意味著密碼不是一個散列,而是 2^16 個。太多無法存儲。
鹽作為散列密碼的一部分存儲。因此bcrypt.CompareHashAndPassword(encryptedPassword, plainPassword)
可以plainPassword
使用相同的鹽進行加密encryptedPassword
并進行比較。
我在這里做錯了什么?
您正在嘗試將生成的散列密碼與存儲的散列密碼進行比較。至少我當然希望它是存儲在數據庫中的散列密碼。
相反,您想要的是將存儲的散列密碼與用戶輸入的普通密碼進行比較。
// 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貢獻1770條經驗 獲得超3個贊
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))
您不需要bcrypt.GenerateFromPassword再打電話;正如您所注意到的,它將生成一個不同的加密密碼,并且幾乎不可能比較兩者是否相等。
- 2 回答
- 0 關注
- 908 瀏覽
添加回答
舉報