मैं बस देख रहा था कि इस समस्या को कैसे हल किया जाए, लेकिन मैं यह भी चाहता हूं कि मेरा फ़ंक्शन एक टोकन बनाने के लिए उपयोग किया जा सकता है जो पासवर्ड पुनर्प्राप्ति के लिए भी उपयोग किया जा सकता है। इसका मतलब यह है कि मुझे अनुमान लगाने के लिए टोकन की क्षमता को सीमित करने की आवश्यकता है। क्योंकि uniqid
समय पर आधारित है, और php.net के अनुसार "वापसी मूल्य सूक्ष्म समय ()" से थोड़ा अलग है, uniqid
मानदंडों को पूरा नहीं करता है। openssl_random_pseudo_bytes()
क्रिप्टोग्राफिक रूप से सुरक्षित टोकन उत्पन्न करने के बजाय PHP का उपयोग करने की सलाह देते हैं ।
एक त्वरित, संक्षिप्त और बिंदु उत्तर के लिए है:
bin2hex(openssl_random_pseudo_bytes($bytes))
जो लंबाई = $ बाइट्स के अल्फ़ान्यूमेरिक वर्णों का एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा। 2. दुर्भाग्य से इसमें केवल एक वर्णमाला है [a-f][0-9]
, लेकिन यह काम करता है।
नीचे सबसे मजबूत कार्य है जो मैं कर सकता हूं जो मानदंडों को संतुष्ट करता है (यह एरिक के उत्तर का एक कार्यान्वित संस्करण है)।
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $range);
return $min + $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet); // edited
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
}
return $token;
}
crypto_rand_secure($min, $max)
rand()
या के बदले में एक बूंद के रूप में काम करता है mt_rand
। यह $ मिनट और $ अधिकतम के बीच एक यादृच्छिक संख्या बनाने में मदद करने के लिए खुलता है_sandom_pseudo_bytes का उपयोग करता है।
getToken($length)
टोकन के भीतर उपयोग करने के लिए एक वर्णमाला बनाता है और फिर लंबाई की एक स्ट्रिंग बनाता है $length
।
EDIT: मैंने स्रोत का हवाला देते हुए उपेक्षा की - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
EDIT (PHP7): PHP7 की रिलीज़ के साथ, मानक पुस्तकालय में अब दो नए कार्य हैं जो ऊपर दिए गए crypto_rand_secure फ़ंक्शन को बदल / सुधार / सरल कर सकते हैं। random_bytes($length)
तथाrandom_int($min, $max)
http://php.net/manual/en/function.random-bytes.php
http://php.net/manual/en/function.random-int.php
उदाहरण:
function getToken($length){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet);
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[random_int(0, $max-1)];
}
return $token;
}