我是否正确理解crypto/rand.Reader 只能在下面未列出的平台上返回Read错误,即它实际上没有实现?
// 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
Run Code Online (Sandbox Code Playgroud)
TL; DR ; crypto/rand的Read()(和Reader.Read())方法可能由于各种原因而失败,即使在列为支持的平台上也是如此.不要认为对此函数的调用将始终成功.始终检查error返回值.
我是否正确理解crypto/rand.Reader只能在下面未列出的平台上返回Read错误,即它实际上没有实现?
不.例如,看看在Linux实现的rand.Reader.如果可用,此实现将使用getrandomLinux系统调用,该调用可能会因许多错误而失败(最重要的是EAGAIN):
EAGAIN- 请求的熵不可用,getrandom()如果GRND_NONBLOCK未设置标志,则会阻止.
这个EAGAIN错误确实告诉你"稍后再试"; 根据的官方含义man 3 errno是"资源暂时不可用".因此,当收到EAGAIN错误时,您可以继续尝试一段时间.
如果getrandom不可用,crypto/rand模块将尝试打开并读取/dev/urandom(请参阅源代码),这也可能由于多种原因而失败.这些错误可能不一定是临时性的(例如,文件系统权限问题); 如果您的应用程序依赖于随机数据的可用性,您应该像应用程序中的任何其他类型的不可恢复错误一样处理错误.
由于这些原因,你应该不认为rand.Read()会一直在Linux/UNIX成功, 总是检查rand.Read()的错误返回值.
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |