我在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()
- 1 回答
- 0 關注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消