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

使用“crypto/rand”生成随机字符串直到成功是个好主意吗?

使用“crypto/rand”生成随机字符串直到成功是个好主意吗?

Go
大话西游666 2023-04-24 16:23:54
在过程成功之前生成一个安全的随机十六进制字符串是个好主意吗?我遇到的所有示例都表明,如果rand.Read返回错误,我们应该恐慌,os.Exit(1) 或返回空字符串和错误。我需要我的程序在出现此类错误时继续运行,并等待生成随机字符串。循环直到生成字符串是个好主意,有什么陷阱吗?import "crypto/rand"func RandomHex() string {    var buf [16]byte    for {        _, err := rand.Read(buf[:])        if err == nil {            break        }    }    return hex.EncodeToString(buf[:])}
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

不。它可能总是在某些情况下返回错误。

不要在 crypto/rand 中使用 /dev/urandom

想象一下,一台机器没有 crypto/rand 从中获取数据的源,或者程序在无法访问该源的上下文中运行。在那种情况下,您可能会考虑让程序以有意义的方式返回该错误,而不是自旋。

更明确地说,如果您认真使用crypto/randthen 考虑编写RandomHex,以便调用者非常清楚它是用于安全上下文(可能重命名它)并从 返回错误RandomHex。调用函数需要处理该错误并让用户知道出了点问题。例如,在 rest api 中,我希望该错误会出现在请求处理程序中,失败并在此时返回 500,并记录一个高严重性错误。


查看完整回答
反对 回复 2023-04-24
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

循环直到生成字符串是个好主意,

那要看。可能是。

有什么陷阱吗?

您丢弃错误读取的随机字节。这是一个紧密的循环。这可能会比填充熵源更快地消耗你的熵源(取决于操作系统)。

而不是无限制的无限循环:在 n 轮后中断并放弃。优雅的降级或停止是最好的:如果你的程序陷入无限循环,它也不会“继续”。


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

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