在PHP中生成一个使用令牌:random_bytes或openssl_random_pseudo_bytes?

Dav*_*rth 17 php random token

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

var_dump(bin2hex(random_bytes(12)));

--> string(24) "338f489ec37a2c2b4943905d"
Run Code Online (Sandbox Code Playgroud)

和使用openssl_random_pseudo_bytes:

var_dump(bin2hex(openssl_random_pseudo_bytes(12)));

--> string(24) "1c7febea20029bd524fba8e7"
Run Code Online (Sandbox Code Playgroud)

openssl_random_pseudo_bytes是PHP 5.3及以上(所以我认为它已经存在了更长时间),并且random_bytes是PHP 7.我使用的是PHP 7,因此我可以使用它们.

那么两者之间是否存在任何重大(或轻微的)差异?如果没有,我很想去,random_bytes因为它有一个更容易的名字(=更容易阅读的代码).

dec*_*eze 20

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

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

引入的主要原因random_bytes是生成伪随机数据在PHP中总是令人头疼,要求开发人员具有平台感知能力,并且可能使用几种不同的回退方法,具体取决于可用的扩展或系统级功能.这经常导致个别实现中的错误,这在安全相关代码中尤其令人担忧.random_bytes通过提供一个始终可用的功能并使用可用的最佳随机源来简化这一过程.如果您可以专门针对PHP 7+,它应该是您的首选方法.


小智 5

只是为了更新,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