存储加密/ rand生成的字符串问题

时间:2015-01-17 20:42:13

标签: go redis

所以我将以下go file(s)作为我的项目的一部分用于散列密码,我还写了一些据我所知的测试尚未失败的测试。

目前的问题是我试图将密码和salt作为字符串存储在某个数据库中,每次我检索它们以与另一个字符串进行比较时,我都会从golang的bcrypt包中获取图片中的消息。我写的测试运行正常并产生适当的效果。我本来会提供一个游乐场链接,但是bcrypt包是标准库的一部分。

我知道来自crypto/rand的乱码与初始外观几乎相同,但我不确定数据库中是否有任何更改。我正在使用redis fyi。

修改:根据@ 3of3的请求,我包含了我项目中的DAO代码。此bcrypt唯一的解决方案也使用此代码,但正如我在评论中所述,我的目标是坚持Mozilla的指南。

enter image description here

2 个答案:

答案 0 :(得分:1)

您似乎忘记了生成的哈希值是十六进制编码的,因此在将[]字节变量转换为字符串时,您会得到一些奇怪的东西。使用hex包可以创建所需的实际字符串:

hex.EncodeToString(hash)

答案 1 :(得分:1)

salt不会通过JSON编码/解码进行往返,因为salt无效UTF8。

有几种方法可以解决问题:

  • Hex或base64对hasher中的salt进行编码/解码。
  • 在整个代码中使用salt的[]字节类型。 JSON编码器使用base64对[]字节值进行编码。
  • 使用gob编码器代替JSON编码器。

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
    }