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

我在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.NewDecoder


err := json.NewDecoder(r.Body).Decode(&newUser)

然后,我对其进行哈希处理并使用 和 存储结果:shajson.MarshalIndentioutil.WriteFile


sha := 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


当我越来越深入地研究这个问题时,我意识到这可能是我对指针/地址的使用,但无论如何我仍然感到困惑。


这是怎么回事?


慕标5832272
浏览 86回答 1
1回答

动漫人物

看起来我不太理解关于将字符串切片转换为字节切片的帖子答案底部的这一点:Gob简单明了。但是,该格式只能使用其他 Go 代码读取。阅读几次是有意义的,Go编码并不意味着将字符串切片直接转换为字节切片。根据评论,Gob是一个编码器,而不是一个字符串切片到字节切片转换器。我可以改用,将数据作为字符串获取,并使用 将其转换为字节。http.Request.Form.Get("key")[]byte()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go