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

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

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

Go
繁星coding 2021-09-10 21:35:44
因此,我将以下go 文件作为项目的一部分用于散列密码,我还编写了一些测试,据我所知尚未失败。目前的问题是我试图将密码和盐作为字符串存储在某个数据库中,每次我检索它们以与另一个字符串进行比较时,我都会从 golang 的 bcrypt 包中获取图片中的消息。我编写的测试运行良好并产生了适当的效果。我会提供一个 go playground 链接,但 bcrypt 包是标准库的一部分。我知道crypto/rand来自初始外观的乱码几乎相同,但我不确定数据库中是否有任何更改。我正在使用 redis 仅供参考。我包含了我的项目中的DAO代码。此外,bcrypt only 解决方案适用于此代码,但正如我在评论中所述,我的目标是坚持 Mozilla 的指南。
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

hex.EncodeToString(hash)


查看完整回答
反对 回复 2021-09-10
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

盐不会通过 JSON 编码/解码往返,因为盐不是有效的 UTF8。

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

  • 十六进制或 base64 编码/解码散列器中的盐。

  • 在整个代码中使用 []byte 类型作为盐。JSON 编码器使用 base64 编码 []byte 值。

  • 使用 gob 编码器而不是 JSON 编码器。

Mozilla 建议将额外的盐与 bcrypted 密码分开存储。通过使用 bcrypted 密码存储额外的盐,系统并不比单独使用 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
    }


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

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