亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

密碼哈希與哈希嘗試不匹配,盡管密碼與嘗試匹配

密碼哈希與哈希嘗試不匹配,盡管密碼與嘗試匹配

Go
慕標5832272 2022-08-24 10:28:13
我在Go服務器上有一個“createUser”功能,在其中我對新用戶的密碼進行哈希處理,并存儲通過POST發送的表單中的數據。用戶及其統計信息的數據庫被拉出并轉換為包含其信息的結構的字符串映射。它看起來像這樣:var userStruct struct {  Users map[string]struct {    Admin, Moderator, Root bool    Pass                   *string  }}它是指針的原因是因為稍后我可能想要更改密碼。因此,當我創建一個新用戶時,我將來自POST請求的JSON取消到結構中,如下所示:var newUser struct{  Username, Password string  IsAdmin, IsModerator bool}我用它來解碼為結構,如下所示:json.NewDecodererr := json.NewDecoder(r.Body).Decode(&newUser)然后,我對其進行哈希處理并使用 和 存儲結果:shajson.MarshalIndentioutil.WriteFilesha := sha1.New()sha.Write([]byte(newUser.Password))var hashedPass string;hashedPass = hex.EncodeToString(sha.Sum(nil))fmt.Println(hashedPass)userStruct.Users[newUser.Username] = struct {    Admin, Moderator, Root bool    Pass                   *string}{    Admin:     newUser.IsAdmin,    Moderator: newUser.IsModerator,    Root:      false,    Pass:      &hashedPass,}fmt.Println(*userStruct.Users[newUser.Username].Pass)    file, _ := json.MarshalIndent(userStruct, "", " ")_ = ioutil.WriteFile("userInfo.json", file, 0644)然后,在登錄端,我將憑據的解析形式的字符串切片轉換為字節切片,并將用戶名/密碼與存儲在數據庫中的用戶名/密碼進行比較。在這里,這表明我可以使用Gob編碼器:r.ParseForm()sha := sha1.New()buf := &bytes.Buffer{}gob.NewEncoder(buf).Encode(r.Form["password"])bufBytes := buf.Bytes()sha.Write(bufBytes)bs := sha.Sum(nil)fmt.Println(hex.EncodeToString(bs))usrJSON, _ := ioutil.ReadFile("userInfo.json")var userStruct struct {    Users map[string]struct {        Root, Admin, Moderator bool        Pass                   *string    }}json.Unmarshal(usrJSON, &userStruct)username := strings.ToLower(strings.Join(r.Form["username"], "")然后,我比較用戶名和密碼。不過,密碼比較是我們需要關注的唯一問題:if *userStruct.Users[username].Pass == hex.EncodeToString(bs) {}在嘗試調試時,我在用戶創建函數和用戶登錄函數中都輸出了哈希的結果。我用于示例的密碼是 。myverysecretpassword存儲的哈希如下所示:7816b9b6485dd785aab9f91a31a0b80997ed44b9密碼嘗試如下所示:08618c3225370a2205d698d06df48ba4b820c1d4當我越來越深入地研究這個問題時,我意識到這可能是我對指針/地址的使用,但無論如何我仍然感到困惑。這是怎么回事?
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

看起來我不太理解關于將字符串切片轉換為字節切片的帖子答案底部的這一點:

Gob簡單明了。但是,該格式只能使用其他 Go 代碼讀取。

閱讀幾次是有意義的,Go編碼并不意味著將字符串切片直接轉換為字節切片。

根據評論,Gob是一個編碼器,而不是一個字符串切片到字節切片轉換器。

我可以改用,將數據作為字符串獲取,并使用 將其轉換為字節。http.Request.Form.Get("key")[]byte()


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號