为什么Linux内核使用get_random_int()来生成stack_canary或stack_top?

为什么Linux内核使用get_random_int()来生成stack_canary或stack_top?

Linux内核中有一个随机数生成器。这通常称为 LRNG(Linux 随机数生成器)。我们可以通过调用来使用它get_random_bytes()。但stack_canarystack_top是由 生成的get_random_int()。虽然Linux内核有自己很好的随机数生成器(LRNG),但是为什么Linux内核要生成它呢get_random_int()?我认为这可能是因为效率。这样对吗?

答案1

只是阅读源码

获取仅供内部内核使用的随机字。与 urandom 类似,但目标是最小化熵池消耗。因此,随机值在加密上并不安全,但对于多种用途而言,消耗熵的成本太高

这就是为什么get_random_int不只获取 的输出get_random_bytes。事实上,这里的论点是错误的,原因有二:

  • 熵实际上并没有耗尽。这只是内核内部的虚假计算。
  • 即使熵确实耗尽,也没有理由不使用加密安全的伪随机数生成器而不是临时构造。只需使用与耗尽 熵的实例不同的实例即可/dev/random。性能可能是一个原因,但适当的 CSPRNG(例如 Hash_DRBG/SHA-2)与此处使用 MD5 的临时构造之间的差异很小。

答案2

Linux 的/dev/random/dev/urandom、 和get_random_bytes()绑定到同一个内部熵池。仅用于 RNG 时很可能会耗尽它并导致/dev/random阻塞并/dev/urandom产生低熵输出。这种低熵条件给加密带来了问题。

相关内容