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中文網其他相關文章!