在“ crypto / rand”成功之前生成随机字符串是个好主意吗?

时间:2018-10-17 19:50:45

标签: go random hex

在过程成功之前生成安全的随机十六进制字符串是个好主意吗?

我遇到的所有示例都表明,如果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 个答案:

答案 0 :(得分:2)

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

示例:playground: don't use /dev/urandom in crypto/rand

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

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

答案 1 :(得分:1)

  

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

这取决于。可能是。

  

有什么陷阱吗?

您丢弃错误读取的随机字节。而且这是一个紧密的循环。 这可能会使您消耗熵源(取决于操作系统)的速度快于 它可以填充。

而不是无限的无限循环:在n回合后中断并放弃。 正常降级或停止是最好的:如果程序被卡在 一个无尽的循环,它也不会“继续”。