用例:“我忘记了密码”按钮。我们无法找到用户的原始密码,因为它是以散列形式存储的,所以唯一要做的就是生成一个新的随机密码并将其通过电子邮件发送给他。这需要密码学不可预测的随机数,mt_rand 对此不够好,而且通常我们不能假设托管服务将提供对操作系统的访问以安装密码学随机数模块等。所以我正在寻找一种方法在 PHP 本身中生成安全的随机数。
到目前为止我提出的解决方案包括存储一个初始种子,然后对于每个调用,
result = seed
seed = sha512(seed . mt_rand())
这是基于 sha512 哈希函数的安全性(mt_rand 调用只是为了让获得数据库副本的对手的生活更加困难)。
我错过了什么,还是有更好的解决方案?
原文由 rwallace 发布,翻译遵循 CC BY-SA 4.0 许可协议
您还可以考虑使用 OpenSSL openssl_random_pseudo_bytes,它从 PHP 5.3 开始可用。
http://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php
由于 PHP 7 还有
random_bytes
可用的功能http://php.net/manual/en/function.random-bytes.php