openssl_random_pseudo_bytes 真的是随机的吗?

Is openssl_random_pseudo_bytes truly random?

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

openssl_random_pseudo_bytes

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

良好的确定性随机位生成器 (DRBG) - 只是 PRNG 的另一个术语 - 具有非常长的循环时间。这意味着只要给定的种子数据中有足够的熵,输出就应该与随机无法区分——在它开始自我重复之前需要很长时间。 Most DRBG 的库/系统在初始化时被播种,OpenSSL 也是如此。

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

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

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

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

It also indicates if a cryptographically strong algorithm was used to produce the pseudo-random bytes, and does this via the optional crypto_strong parameter. It's rare for this to be FALSE, but some systems may be broken or old.

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