Linux内核中有一个随机数生成器。这通常称为 LRNG(Linux 随机数生成器)。我们可以通过调用来使用它get_random_bytes()
。但stack_canary
和stack_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
产生低熵输出。这种低熵条件给加密带来了问题。