从 dev/urandom 读取 - 系统行为

Woo*_*ock 6 filesystems devices random unix-philosophy

dev/urandom使用 sayhead或读取时,dd当然期望输出总是随机且不同的。

UNIX 如何在低级别处理这种情况?文件是在读取时自然截断,还是文件实际上是对称密码或等价物的接口,因此“读取”实际上是执行密码的行为。

Ste*_*itt 13

/dev/urandom是字符设备,而不是常规文件。打开它为驱动程序提供了一个接口,通常在内核中,它处理读取;每次程序从 读取时/dev/urandom,都会调用驱动程序,驱动程序确定如何提供适当的内容(与任何其他字符设备相同—— /dev/null/dev/zero...)。

在 Linux 上,这是在drivers/char/random.c. 它维护一个“熵池”,从各种随机数据源中播种,并在读取时使用 ChaCha 流密码处理池数据以构造要返回的数据。


Áng*_*gel 8

/dev/urandom不是“常规文件”(是的,这是 POSIX 命名),它是一个设备。就像 /dev/ 上的大多数“文件”一样,那里有很多神奇的行为。

  • 你有/dev/null,无论你写多少,它永远不会填满
  • 你有random/urandom/srandom,每次随机提供不同的数据
  • 您有/dev/tty(和同事)与终端交互的地方
  • /dev/full对于任何写入尝试,您总是返回“设备上没有剩余空间”
  • 你有/dev/zero返回无限组的空字节

还有很多。

这些文件实际上是与内核模块交互的接口。因此,当您“读取”它时,它实际上是在执行一个函数,该函数被要求读取程序(head、dd 等)请求的字节数(/dev/urandom字符设备)。这个函数然后在内部处理它(基于几个熵池)以填充该缓冲区(在这种情况下,以便您获得伪随机内容)。