openssl_random_pseudo_bytes真的是随机的吗?


Is openssl_random_pseudo_bytes truly random?

我想知道为什么这个函数的名称上有"伪"。我可以相信这些字节真的是随机的吗?我在php的手册中没有找到任何关于这一点的解释。

openssl_random_pseudo_bytes

伪随机数生成器(PRNG)中对"伪"一词有两种解释。这可能意味着结果可能不是完全随机的。这也可能意味着随机数生成器本身是确定性的。这就是OpenSSL意义上的伪

良好的确定性随机位发生器(DRBG) - 只是PRNG的另一个术语 - 具有非常高的周期时间。这意味着只要给定种子数据中有足够的熵,输出就应该与随机无法区分 - 在开始重复之前需要很长时间。大多数DRBG的库/系统在初始化时都是种子的,同样适用于OpenSSL也是如此。

通常,"真正的随机"是指直接从熵源检索的随机值。通常,这些来源确实提供了足够的熵,但这并不一定意味着熵分布良好。因此,使用真实随机源的熵来播种 DRBG 通常更好、更快。

现在,随机源通常仅适用于操作系统(因为它们通常链接到低级 I/O 操作)。因此,随机种子首先用于操作系统中的随机池(例如 /dev/random ),这反过来又可用于播种 DRBG。这些池通常已经变白,以创建更好的分布。

所以你会得到:熵 -> os 熵池 -> openssl random_pseudo_bytes -> PHP 包装器 ->你的应用程序。

在嵌入式系统上,您可能需要注意以下警告:

它还指示是否使用加密强算法来生成伪随机字节,并通过可选的 crypto_strong 参数执行此操作。这种情况很少被FALSE,但有些系统可能已损坏或陈旧。

否则,它可能是随机数最可靠的来源。