为了账号安全,请及时绑定邮箱和手机立即绑定

密码哈希与哈希尝试不匹配,尽管密码与尝试匹配

密码哈希与哈希尝试不匹配,尽管密码与尝试匹配

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 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信