猿问

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

因此,我将以下go 文件作为项目的一部分用于散列密码,我还编写了一些测试,据我所知尚未失败。

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

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

我包含了我的项目中的DAO代码。此外,bcrypt only 解决方案适用于此代码,但正如我在评论中所述,我的目标是坚持 Mozilla 的指南。

繁星coding
浏览 202回答 2
2回答

qq_花开花谢_0

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

明月笑刀无情

盐不会通过 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     }
随时随地看视频慕课网APP

相关分类

Go
我要回答