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实现细节的问题,它不属于这里。