gpt4 book ai didi

go - rand.Reader读取时可能会报错?

转载 作者:IT王子 更新时间:2023-10-29 01:50:59 27 4
gpt4 key购买 nike

我是否正确理解 crypto/rand.Reader 可以在下面未列出的平台上返回读取错误,即当它没有实际实现时?

// Reader is a global, shared instance of a cryptographically
// strong pseudo-random generator.
//
// On Linux, Reader uses getrandom(2) if available, /dev/urandom otherwise.
// On OpenBSD, Reader uses getentropy(2).
// On other Unix-like systems, Reader reads from /dev/urandom.
// On Windows systems, Reader uses the CryptGenRandom API.
var Reader io.Reader

最佳答案

长话短说crypto/randRead()(和 Reader.Read())方法可能由于各种原因而失败,即使在列为受支持的平台。 不要假设对此函数的调用总是会成功。 始终检查错误返回值。


Do I understand correctly that crypto/rand.Reader can return Read error only on platforms not listed below, i.e. when it is not actually implemented?

。例如,查看 rand.ReaderLinux implementation。如果可用,此实现将使用 getrandom Linux system call ,它可能会因许多错误而失败(最重要的是,EAGAIN):

EAGAIN - The requested entropy was not available, and getrandom() would have blocked if the GRND_NONBLOCK flag was not set.

EAGAIN 错误直接告诉您“稍后再试”;根据 man 3 errno 的官方含义是“资源暂时不可用”。因此,当收到 EAGAIN 错误时,您可以简单地继续尝试一段时间。

如果 getrandom 不可用,crypto/rand 模块将尝试打开并从 /dev/urandom 读取(参见 source code) ,这也可能由于多种原因而失败。这些错误不一定是临时性的(例如,文件系统权限问题);如果您的应用程序依赖于随机数据的可用性,您应该像对待应用程序中任何其他类型的不可恢复错误一样对待错误。

由于这些原因,您不应该假设rand.Read() 在 Linux/UNIX 上总是会成功并且总是检查rand.Read()的错误返回值。

关于go - rand.Reader读取时可能会报错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com