在Linux里,随机数到底有多重要?其实它就是个命门。TCP/IP序列号、密码的盐值、DNS的源端口号,这些安全保障的核心不在于算法多高级,而是全看随机数质量。没有随机性,加密就成了可以猜透的游戏,整个系统的安全防线立马崩塌。所以Linux内核直接把生成好的随机数写到了系统里,每次开机都能给系统“洗牌”。 这个“洗牌”的地方叫熵池,它就像个大水库。内核把电脑里各种环境噪音都扔进去:鼠标点来点去、键盘敲敲打打、有人拔掉网线、内存出错、CPU卡了一下……这些统统都变成了随机种子。这些种子先得“漂白”一下,去掉偏向性再乱搅一通,让一切可预测的模式都消失不见。最后凑出了4096位的主熵池和两个128位的次熵池。 用/dev/random请求随机数的时候挺傲娇的。如果你要N个字节,先看次熵池够不够;不够再动用主熵池;只要哪个池子里没货了,程序就得立刻卡住不动,等到环境再产生新噪音才行。它保证拿多少有多少,但一旦没水喝了就只能傻等着。这种高贵的真随机适合做一次性的事儿,比如SSL会话的ID或者是加密密钥。 而/dev/urandom就随性多了。你调用它的时候,内核先查查池子满不满;要是满的直接发数;要是空的也不会卡住,而是立马用算法造一批伪随机数出来。虽然质量差点意思,但绝大多数应用程序用着都足够了。它最大的特点就是永不阻塞,特别适合那种要跑大量数据的地方,比如SSH密钥或者一次性令牌。 其实真随机跟伪随机也没什么绝对界限。真的是靠环境噪音来的,但有些小系统噪音源太固定、太好猜了,这时候/dev/urandom用算法生成的反而更安全;反过来看那些大服务器硬件资源多,/dev/random提供的真随机才是硬通货。 选哪一个就看你咋想了。如果追求最高的安全等级肯定得选/dev/random,但你得做好可能会卡住的准备;如果是要量大管饱又不能堵着路走就选/dev/urandom;如果既想要安全又不耽误速度可以先试试urandom,如果速度不够再切回/dev/random。 归根结底,/dev/random这东西耗不起电量太大了。主熵池只有4096位深度呢,再好的硬件也扛不住无休无止地调用它。urandom虽然是备用方案,但真的在99%的情况下都能让你的程序跑起来。世界上没有绝对好坏的东西,只有适合不适合;用对了地方随机数就是你的安全护城河;用错了哪怕服务器再高端也照样裸奔。