所以我将以下go file(s)作为我的项目的一部分用于散列密码,我还写了一些据我所知的测试尚未失败的测试。
目前的问题是我试图将密码和salt作为字符串存储在某个数据库中,每次我检索它们以与另一个字符串进行比较时,我都会从golang的bcrypt包中获取图片中的消息。我写的测试运行正常并产生适当的效果。我本来会提供一个游乐场链接,但是bcrypt包是标准库的一部分。
我知道来自crypto/rand
的乱码与初始外观几乎相同,但我不确定数据库中是否有任何更改。我正在使用redis fyi。
修改:根据@ 3of3的请求,我包含了我项目中的DAO代码。此bcrypt唯一的解决方案也使用此代码,但正如我在评论中所述,我的目标是坚持Mozilla的指南。
答案 0 :(得分:1)
您似乎忘记了生成的哈希值是十六进制编码的,因此在将[]字节变量转换为字符串时,您会得到一些奇怪的东西。使用hex包可以创建所需的实际字符串:
hex.EncodeToString(hash)
答案 1 :(得分:1)
salt不会通过JSON编码/解码进行往返,因为salt无效UTF8。
有几种方法可以解决问题:
Mozilla建议将额外的盐与加密密码分开存放。通过使用加密密码存储额外的盐,系统不比单独使用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
}