अच्छे समाधान
यह मानता है कि 256-बिट गैर आवश्यक है।
random_bytes(32)
(पीएचपी 7.0.0+)
openssl_random_pseudo_bytes(32)
mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)
- # 4 के लिए
/dev/urandom
कोड स्निपेट से पढ़ रहा है:
<?php
function getRandom($bytes)
{
// Read only, binary safe mode:
$fp = fopen('/dev/urandom', 'rb');
// If we cannot open a handle, we should abort the script
if ($fp === false) {
die("File descriptor exhaustion!");
}
// Do not buffer (and waste entropy)
stream_set_read_buffer($fp, 0);
$entropy = fread($fp, $bytes);
fclose($fp);
return $entropy;
}
बुरा Solu माहौल
mt_rand()
rand()
uniqid()
microtime(true)
lcg_Value()
क्या बनाता है एक समाधान अच्छा?
एक अच्छा समाधान क्रिप्टोग्राफ़िक रूप से सुरक्षित छद्म यादृच्छिक संख्या जनरेटर (सीएसपीआरएनजी) का लाभ उठाना चाहिए। यूनिक्स-आधारित ऑपरेटिंग सिस्टम पर, इसे /dev/urandom
से सीधे पढ़कर हासिल किया जा सकता है।
लेकिन मुझे समझ में नहीं आता कि टोकन अनुमानित कैसे हो सकता है।
इस विषय को पहले से काफी गहराई से कवर किया गया है।
मैं निम्नलिखित कोड है:
<?php
srand(time());
$reset_password_token = rand(444444444444,999999999999);
?>
सिद्धांत रूप में, वहाँ होगा इसके लिए केवल 555555555555 संभावित मान हों। दुर्भाग्य से, वास्तविक संख्या बहुत कम है।
rand()
एक लिनियर कंस्ट्रुएंट जेनरेटर नामक एल्गोरिदम का उपयोग करता है, जो कि PHP 5 में इसे कैसे कार्यान्वित किया जाता है, केवल 32-बिट पूर्णांक के साथ काम करता है। आपके द्वारा प्रदान की गई दोनों संख्या 2**32
से बड़ी हैं। मुझे यकीन नहीं है कि यह बह जाएगा। इस मामले में The source code बहुत प्रबुद्ध नहीं है।
हालांकि, आप पर time()
के साथ अपने यादृच्छिक संख्या बोने कर रहे हैं, तो आप मुसीबत में पड़ जा रहे हैं।
<?php
srand(1431223543);
echo rand()."\n";
आप अपने कंसोल में 1083759687
देखना चाहिए: जल्दी, इस कोड को चलाते हैं। आम तौर पर, इंटरनेट पर कंप्यूटर के बीच का समय अंतर बहुत छोटा है। आप शायद प्रत्येक टाइमज़ोन में केवल 2 सेकंड तक के संभावित जिटर के लिए खाते हैं, और यह आपको यादृच्छिक संख्या आउटपुट की भविष्यवाणी करने के लिए केवल 120 अनुमान (सबसे खराब मामला) लेगा। हमेशा के लिए।
कृपया, कुछ भी अपने आवेदन की सुरक्षा से संबंधित के लिए, एक CSPRNG का उपयोग करें।
बीज केवल एक ही समस्या है। एक अप्रत्याशित बीज के साथ भी, 'रैंड' का उपयोग, एक सुरक्षा भेद्यता है। –