一尘不染

用PHP安全地生成随机数

php

用例:“我忘记了密码”按钮。我们找不到用户的原始密码,因为它以散列形式存储,因此唯一要做的就是生成一个新的随机密码,然后通过电子邮件发送给他。这就要求使用密码无法预测的随机数,而mt_rand不够好,因此通常我们不能假定托管服务将提供对操作系统的访问权以安装密码随机数模块等。因此,我在寻找一种方法在PHP本身中生成安全的随机数。

到目前为止,我提出的解决方案包括存储初始种子,然后针对每个调用,

result = seed
seed = sha512(seed . mt_rand())

这基于sha512哈希函数的安全性(mt_rand调用只会使获得数据库副本的对手的生活更加艰难)。

我是否缺少某些东西,或者有更知名的解决方案?


阅读 293

收藏
2020-05-26

共1个答案

一尘不染

您还可以考虑使用OpenSSL openssl_random_pseudo_bytes,该版本自PHP 5.3起可用。

 string openssl_random_pseudo_bytes ( int $length [, bool &$crypto_strong ] )

生成一串伪随机字节,其字节数由length参数确定。它还指示是否使用了加密功能强的算法来生成伪随机字节,并通过可选的crypto_strong参数来执行此操作。很少会出现FALSE,但是某些系统可能已损坏或过旧。

从PHP 7开始,还有random_bytes可用的功能

string random_bytes ( int $length )
2020-05-26