PHP 中的安全随机数生成:全面概述
密码学通常需要生成不可预测的随机数。在 PHP 中,“mt_rand”函数达不到这些要求。本文深入研究了一种在 PHP 本身中生成随机数的安全方法,解决了忘记密码的问题。
最初提出的解决方案涉及存储种子并在每次调用时更新它,如下所示:
result = seed seed = sha512(seed . mt_rand())
但是,这种方法有很大的缺点。 sha512 函数不会神奇地增强熵,并且“mt_rand”调用不足以阻止对手。相反,建议利用现代操作系统提供的熵源:
这是一个 PHP 代码片段,用于生成安全的 128 位随机数string:
$pr_bits = ''; if (file_exists("/dev/urandom")) { $fp = fopen('/dev/urandom','rb'); $pr_bits .= fread($fp, 16); fclose($fp); } elseif (class_exists('COM')) { try { $CAPI_Util = new COM('CAPICOM.Utilities.1'); $pr_bits .= $CAPI_Util->GetRandom(16, 0); if ($pr_bits) { $pr_bits = md5($pr_bits, TRUE); } } catch (Exception $ex) { // echo 'Exception: ' . $ex->getMessage(); } } if (strlen($pr_bits) < 16) { // Inform the administrator of the missing pseudorandom generator }
请记住在代码中包含两个熵源尝试,以获得最大的可移植性。虽然这种方法可能并非万无一失,但与最初的基于种子的方法相比,它在安全性方面提供了显着的改进。
以上是如何在 PHP 中为密码重置等应用程序安全地生成随机数?的详细内容。更多信息请关注PHP中文网其他相关文章!