我在 Linux 上,它具有地址空间布局随机化。是否有必要在堆栈上声明一个缓冲区,让它未初始化,并将其用于熵,或者我可以只取堆栈上已经存在的东西的地址,将其转换为整数并且(知道它有点随机,因为解决空间布局随机化)使用该整数代替熵?
指针方法的优势在于它不会像单元化缓冲区那样在您尝试操作它时生成编译器警告,但在我的测试中,似乎只有地址的低位部分(可能是最后一个或两个字节)会改变从调用到调用。熵缓冲区的性能似乎更差,通常什么都没有。
如果您需要 Linux 上的弱熵,为什么不阅读/dev/urandom
?它是一种非阻塞变体,/dev/random
它更少......随机(但同样是非阻塞)。
从根本上说,如果你需要任何东西的熵,你需要从一些外部来源获取它,而不是编译器的一些怪癖,或者内存分配布局的期望。不能保证编译器会给你不同的指针。您可能编写的代码在一个系统上运行良好,但在另一个系统上完全无法给出熵。
正如其他人所建议的,使用 /dev/random 是一个好主意。如果这不可用,如果您只需要一点熵,您可能可以调用 time() 函数 (time.h)。
但是,当人们只要求一点熵时,我会非常担心,因为这表明某种对随机值的依赖。只有一点点熵意味着它会经常返回相同的值,可能导致系统以意想不到的方式失败。我强烈建议始终从 /dev/random 等来源获得良好的熵。
/dev/random 有什么问题?
不要将未初始化的内存用于熵。特别是堆栈。它倾向于在连续运行中看起来非常相似。它是完全可预测的,不是很随机的。
你说的弱到底是什么意思?C 中熵的规范来源(用于非加密目的)time
来自<time.h>
.
访问未初始化的变量是未定义的行为,在某些平台上可能会产生不可预知的后果。不要这样做。
为什么不从/dev/random
or中读取几个字节/dev/urandom
?