在过程成功之前生成一个安全的随机十六进制字符串是个好主意吗?我遇到的所有示例都表明,如果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/rand
then 考虑编写RandomHex
,以便调用者非常清楚它是用于安全上下文(可能重命名它)并从 返回错误RandomHex
。调用函数需要处理该错误并让用户知道出了点问题。例如,在 rest api 中,我希望该错误会出现在请求处理程序中,失败并在此时返回 500,并记录一个高严重性错误。
开心每一天1111
TA贡献1836条经验 获得超13个赞
循环直到生成字符串是个好主意,
那要看。可能是。
有什么陷阱吗?
您丢弃错误读取的随机字节。这是一个紧密的循环。这可能会比填充熵源更快地消耗你的熵源(取决于操作系统)。
而不是无限制的无限循环:在 n 轮后中断并放弃。优雅的降级或停止是最好的:如果你的程序陷入无限循环,它也不会“继续”。
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消