我需要在PHP中生成一次性令牌。我可以使用两个可用于执行此操作的功能:random_bytes和openssl_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及以上(所以我认为它已经存在了更长时间),random_bytes
是PHP 7.我使用PHP 7所以我可以使用
两者之间是否有任何重大(或轻微的)差异?如果没有,我很想与random_bytes
一起使用只是因为它有一个更简单的名称(=代码更容易阅读)。
答案 0 :(得分:16)
openssl_random_pseudo_bytes
是OpenSSL扩展的一部分,它必须在PHP编译过程中显式configured and included,并且需要外部依赖。
random_bytes
是PHP 7中的新增功能,是生成随机字节的本机常用PHP方法,可根据其所使用的平台选择其内部随机源。
引入random_bytes
的主要原因是生成伪随机数据在PHP中总是令人头疼,要求开发人员能够了解平台并可能使用几种不同的回退方法,具体取决于哪些扩展或系统级功能可用。这经常导致个别实现中的错误,这在安全相关代码中尤其令人担忧。 random_bytes
通过提供一个始终可用的函数并使用可用的最佳随机源来简化此操作。如果您可以专门针对PHP 7+,那么它应该是您的首选方法。
答案 1 :(得分:2)
为了更新,openssl_random_pseudo_bytes中的加密不安全性在2016年得到修复。更多详细信息:
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8867
现在使用RAND_bytes,OpenSSL在其wiki中推荐:
答案 2 :(得分:1)
根据php手册
random_bytes :生成加密安全伪随机字节 openssl_random_pseudo_bytes :生成伪随机字节串
所以主要区别在于加密安全
openssl_random_pseudo_bytes()PHP函数调用 RAND_psuedo_bytes()OpenSSL函数,OpenSSL文档说 应仅用于非加密目的:
https://paragonie.com/blog/2015/07/how-safely-generate-random-strings-and-integers-in-php