在过程成功之前生成安全的随机十六进制字符串是个好主意吗?
我遇到的所有示例都表明,如果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[:])
}
答案 0 :(得分:2)
不。在某些情况下,它可能总是返回错误。
示例:playground: don't use /dev/urandom in crypto/rand
想象一下,一台机器没有加密/兰特从中获取数据的源,或者该程序在无法访问该源的上下文中运行。在这种情况下,您可以考虑让程序以有意义的方式而不是旋转返回该错误。
更明确地说,如果您认真使用crypto/rand
,请考虑编写RandomHex
,以使调用者非常清楚地知道它是用于安全上下文的(可以重命名)并返回RandomHex
中的错误。调用函数需要处理该错误,并让用户知道某些错误。例如,在rest api中,我希望该错误会浮现到请求处理程序中,并在该点失败并返回500,并记录一个严重性高的错误。
答案 1 :(得分:1)
循环直到生成字符串是个好主意
这取决于。可能是。
有什么陷阱吗?
您丢弃错误读取的随机字节。而且这是一个紧密的循环。 这可能会使您消耗熵源(取决于操作系统)的速度快于 它可以填充。
而不是无限的无限循环:在n回合后中断并放弃。 正常降级或停止是最好的:如果程序被卡在 一个无尽的循环,它也不会“继续”。