因此,我將以下go 文件作為項目的一部分用于散列密碼,我還編寫了一些測試,據我所知尚未失敗。目前的問題是我試圖將密碼和鹽作為字符串存儲在某個數據庫中,每次我檢索它們以與另一個字符串進行比較時,我都會從 golang 的 bcrypt 包中獲取圖片中的消息。我編寫的測試運行良好并產生了適當的效果。我會提供一個 go playground 鏈接,但 bcrypt 包是標準庫的一部分。我知道crypto/rand來自初始外觀的亂碼幾乎相同,但我不確定數據庫中是否有任何更改。我正在使用 redis 僅供參考。我包含了我的項目中的DAO代碼。此外,bcrypt only 解決方案適用于此代碼,但正如我在評論中所述,我的目標是堅持 Mozilla 的指南。
2 回答

qq_花開花謝_0
TA貢獻1835條經驗 獲得超7個贊
您似乎忘記了生成的哈希是十六進制編碼的,因此將 []byte 變量轉換為字符串時,您會得到一些奇怪的東西。使用 hex 包你可以創建你想要的實際字符串:
hex.EncodeToString(hash)

明月笑刀無情
TA貢獻1828條經驗 獲得超4個贊
鹽不會通過 JSON 編碼/解碼往返,因為鹽不是有效的 UTF8。
有幾種方法可以解決問題:
十六進制或 base64 編碼/解碼散列器中的鹽。
在整個代碼中使用 []byte 類型作為鹽。JSON 編碼器使用 base64 編碼 []byte 值。
使用 gob 編碼器而不是 JSON 編碼器。
Mozilla 建議將額外的鹽與 bcrypted 密碼分開存儲。通過使用 bcrypted 密碼存儲額外的鹽,系統并不比單獨使用 bcrypt 更安全。
要對鹽進行十六進制編碼,請更改
return string(p), string(salt), nil
到
return string(p), hex.EncodeToString(salt), nil
和改變
s := []byte(salt)
到
s, err := hex.DecodeString(salt) if err != nil { return err }
- 2 回答
- 0 關注
- 241 瀏覽
添加回答
舉報
0/150
提交
取消