Go crypto/rand如何生成安全的随机数?
我开始发疯了,我想看看里面是怎么工作的 我想看看它何时从Go crypto/rand如何生成安全的随机数?,go,random,cryptography,Go,Random,Cryptography,我开始发疯了,我想看看里面是怎么工作的 我想看看它何时从dev/random(更安全)生成RAND,何时从dev/uradom(安全性更低)生成RAND 如果rand\u batched.go被初始化(这将初始化altGetRandom),并且GOOS不是plan9(然后r.name=urandomDevice它将返回随机数组的长度,而不是内容(这很奇怪,为什么是长度?) 见第57行: if altGetRandom != nil && r.name == urandomDevi
dev/random
(更安全)生成RAND,何时从dev/uradom
(安全性更低)生成RAND
如果rand\u batched.go
被初始化(这将初始化altGetRandom),并且GOOS
不是plan9(然后r.name=urandomDevice
它将返回随机数组的长度,而不是内容(这很奇怪,为什么是长度?)
见第57行:
if altGetRandom != nil && r.name == urandomDevice && altGetRandom(b) {
return len(b), nil
}
否则它将只返回数组的内容,仅当GOOS=plan9时,该数组将基于dev/random
那么它为什么要返回len(b)?
另外,在我看来,大多数时候它都会使用
dev/uradom
,这是次优的…我错了吗(我猜是因为文档,但请帮助我理解)?altGetRandom
用于系统调用以获取随机字节的系统,而不是依赖于/dev/uradom
的存在。这在特殊环境中有时很有用(一个没有/dev
的chroot,Docker-ish系统有奇怪的/错误的/dev
,FreeBSD监狱有不正确的/dev
设置,等等),并且比打开文件要快一点(因为它没有经过太多的系统调用层),尽管一般来说应该只使用该文件
所讨论的调用是在
io.Reader
风格的函数中进行的,该函数的任务是返回读取的字节块的长度以及任何错误。当使用系统调用时,操作系统会完全填充数组b
,因此len(b)
是正确的结果。>我想看看它何时从dev/random生成RAND(更安全),何时从dev/urandom生成RAND(安全性更低)我不确定这句话是不是真的。看,我投票决定结束这个问题,因为它不是关于解决一个特定的问题,而是关于stdlib实现细节的问题,它不属于这里。