在 PHP 中生成一次性令牌:random_bytes还是openssl_random_pseudo_bytes?

2022-08-30 14:54:53

我需要在PHP中生成一个一次性令牌。有两个可用的函数,我可以使用它们似乎做同样的事情:random_bytesopenssl_random_pseudo_bytes。例如,使用 :random_bytes

var_dump(bin2hex(random_bytes(12)));

--> string(24) "338f489ec37a2c2b4943905d"

并使用 :openssl_random_pseudo_bytes

var_dump(bin2hex(openssl_random_pseudo_bytes(12)));

--> string(24) "1c7febea20029bd524fba8e7"

openssl_random_pseudo_bytes是 PHP 5.3 及更高版本(所以我假设它已经存在了更长的时间),并且是 PHP 7。我使用的是 PHP 7,所以我可以使用其中任何一个。random_bytes

那么,两者之间有什么主要(或次要)区别吗?如果没有,我很想去,因为它有一个更容易的名字(=代码更容易阅读)。random_bytes


答案 1

openssl_random_pseudo_bytes是 OpenSSL 扩展的一部分,该扩展必须显式配置并包含在 PHP 编译过程中,并且需要外部依赖项。

random_bytes是 PHP 7 中的新增功能,它是生成随机字节的本机始终可用的 PHP 方法,它根据其所在的平台选择其内部随机性源。

引入的主要原因是,在PHP中生成伪随机数据总是有点头疼,要求开发人员具有平台意识,并可能根据可用的扩展或系统级函数使用几种不同的回退方法。这通常会导致单个实现中的错误,这在与安全相关的代码中尤其令人担忧。 通过提供一个始终可用的函数并使用可用的最佳随机性源来简化此函数。如果您可以专门定位 PHP 7+,那么它应该是您的首选方法。random_bytesrandom_bytes


答案 2

只是为了更新,openssl_random_pseudo_bytes的加密不安全性在2016年得到了修复。更多详细信息,请单击此处:

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8867

它现在使用RAND_bytes,OpenSSL在其wiki中推荐:

https://wiki.openssl.org/index.php/Random_Numbers#FIPS_Mode


推荐