猿问

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

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


我遇到的所有示例都表明,如果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[:])

}


大话西游666
浏览 191回答 2
2回答

慕侠2389804

不。它可能总是在某些情况下返回错误。不要在 crypto/rand 中使用 /dev/urandom想象一下,一台机器没有 crypto/rand 从中获取数据的源,或者程序在无法访问该源的上下文中运行。在那种情况下,您可能会考虑让程序以有意义的方式返回该错误,而不是自旋。更明确地说,如果您认真使用crypto/randthen 考虑编写RandomHex,以便调用者非常清楚它是用于安全上下文(可能重命名它)并从 返回错误RandomHex。调用函数需要处理该错误并让用户知道出了点问题。例如,在 rest api 中,我希望该错误会出现在请求处理程序中,失败并在此时返回 500,并记录一个高严重性错误。

开心每一天1111

循环直到生成字符串是个好主意,那要看。可能是。有什么陷阱吗?您丢弃错误读取的随机字节。这是一个紧密的循环。这可能会比填充熵源更快地消耗你的熵源(取决于操作系统)。而不是无限制的无限循环:在 n 轮后中断并放弃。优雅的降级或停止是最好的:如果你的程序陷入无限循环,它也不会“继续”。
随时随地看视频慕课网APP

相关分类

Go
我要回答