2015-05-09 8 views
10

पासवर्ड रीसेट (या सीएसआरएफ टोकन के लिए) टोकन उत्पन्न करने के लिए srand(time()) का उपयोग करना खराब है क्योंकि टोकन अनुमानित किया जा सकता है।क्यों srand (समय()) एक बुरा बीज है?

मैं इन पढ़ें:

लेकिन मुझे समझ नहीं आता कैसे टोकन उम्मीद के मुताबिक हो सकता है। मैं समझता हूं कि यदि एक सेकंड में मैं अपना पासवर्ड रीसेट करता हूं तो कई बार मुझे एक ही टोकन मिलता है।

<?php 

srand(time()); 
$reset_password_token = rand(444444444444,999999999999); 

?> 

अगर मैं एक सेकंड में अपना पासवर्ड कई बार रीसेट, मुझे पता है मैं एक ही टोकन, लेकिन कैसे एक हमलावर इस दोहन कर सकते हैं मिलता है: मैं निम्नलिखित कोड है?

+0

बीज केवल एक ही समस्या है। एक अप्रत्याशित बीज के साथ भी, 'रैंड' का उपयोग, एक सुरक्षा भेद्यता है। –

उत्तर

13

यह उनके क्रूर बल के दायरे को सीमित करता है। उदाहरण के लिए, उन्हें केवल 60 पासवर्ड का प्रयास करने की आवश्यकता है यदि उन्हें पता है कि किसी ने आखिरी मिनट में रीसेट किया था।

लेकिन इससे भी बदतर है। हमलावर उस खाते के लिए पासवर्ड रीसेट शुरू करके इच्छित किसी भी खाते में जा सकता है। इसके बाद, वे रीसेट के आसपास समय की कुछ छोटी खिड़की के लिए यूनिक्स टाइमस्टैम्प के साथ बार-बार एसआरएंड को कॉल करके कुछ टोकन उत्पन्न करते हैं, हर बार बढ़ते हैं। उन टोकनों में से एक तब तक मेल खाना चाहिए जब तक कि आपकी घड़ी बंद न हो जाए।

+0

मान लीजिए कि मैं बिल्कुल टाइमस्टैम्प जानता हूं और मुझे एल्गोरिदम जेनरेटर (मेरे उदाहरण की तरह रेंज नंबर) पता है। तो मैं समझता हूँ, अगर मैं इस प्रयास करें: 'जबकि (1) { // नया टोकन genere और वेबसाइट srand ($ sametimestamp) में टाइमस्टैम्प पर कब्जा; $ reset_password_token = रैंड (444444444444,999999999999); // वेबसाइट नींद (3); // में टोकन का परीक्षण करें, फिर से एक नया टाइमस्टैम्प } ' मैं टोकन अनुमान लगा सकता हूं? – sushi

+1

हां। कोशिश करो। रैंड का उत्पादन (444444444444,99 99 99 99 99 99) एसआरएंड को मूल्य इनपुट द्वारा निर्धारित किया जाता है। –

+0

मैं इसे आज़माता हूं और यह काम नहीं करता है। मुझे लगता है कि अगर मैं 5 मिनट की अग्रिम के साथ टाइमस्टैम्प के साथ कई टोकन उत्पन्न कर सकता हूं तो शायद यह काम हो? – sushi

7

समय सीमा हमले

हमलावर आपके सिस्टम के समय को जान/अनुमान लगा सकता है। बेशक एक हैकर सटीक दूसरे को नहीं जान सकता क्योंकि ज्यादातर सर्वरों के लिए जो थोड़ा अलग हो सकते हैं।

लेकिन कहते हैं कि उदाहरण के लिए आपके स्थानीय समय है:

> echo time(); 
1431212010 

तो आप एक "अच्छा अनुमान" कर सकते हैं कि बीज 1431212005 और 1431212015 के बीच में स्थित होगा।

तो यदि आप 10 अनुमानों की तरह कर सकते हैं, तो बाधाओं की संभावना है कि पासवर्ड सही होगा।

बेशक हैकर को अभी भी एल्गोरिदम पता होना चाहिए जो पासवर्ड उत्पन्न करता है। लेकिन ज्यादातर प्रणालियों के लिए, यह हमेशा सुरक्षा में हमेशा के लिए सरल और आगे है, यह बेहतर है कि किसी को भी सिस्टम के बारे में इतना कुछ पता नहीं है। सभी हैकर्स अपना खाता बना सकते हैं और "निरीक्षण" कर सकते हैं कि पासवर्ड कैसे उत्पन्न होता है और पहले पैटर्न की तलाश करता है।

हैकर एक खाता उसे/खुद

एक इसके अलावा एक ही पल में लगभग दो पासवर्ड रीसेट अनुरोध पोस्ट है लोगों पासवर्ड हैक करने वास्तव में सुविधाजनक तरीका है: कहते हैं कि तुम एक खाता एक्स है और आप खाते को हैक करना चाहते हैं वाई। मिलीसेकंड के भीतर, आप दो अनुरोध जमा कर सकते हैं, एक स्वयं के लिए और एक पीड़ित के लिए। इसके बाद आपको अपना पासवर्ड प्राप्त होता है और आप इसे दोनों खातों के लिए उपयोग कर सकते हैं। @AlfredRossi के रूप में, आप वेबसाइट के सभी खातों पर अधिक जानकारी दे सकते हैं और इस प्रकार अधिकांश खातों को हैक कर सकते हैं।

समाधान

अधिकांश सिस्टम एक तरीका प्रदान उत्पन्न करने के लिए 'असली यादृच्छिक "(निश्चित रूप से यह बहस का मुद्दा है कि क्या हम वास्तविक यादृच्छिक के बारे में बात)।उदाहरण के लिए ऑडियो चैनलों पर शोर को कैप्चर करके या अन्य "शोर" सुनें। ये मान कम अनुमानित हैं क्योंकि कोई शायद ही अनुमान लगा सकता है कि ऑडियो चैनल पर मापा तीव्रता उसके स्थान से कुछ हजार मील की दूरी पर है।

+1

'अधिकांश सिस्टम एक तरीका प्रदान उत्पन्न करने के लिए 'असली यादृच्छिक" (निश्चित रूप से यह बहस का मुद्दा है कि क्या हम के बारे में वास्तविक यादृच्छिक बात) 'बात करने के लिए अधिक, [आप नहीं असली यादृच्छिक चाहते] (http://sockpuppet.org क्रिप्टोग्राफी के लिए/ब्लॉग/2014/02/25/सुरक्षित रूप से उत्पन्न-यादृच्छिक-संख्या)। –

+0

एक चल रहा है, वृद्धिशील पूर्णांक नहीं, timeseed में जोड़ा, दोनों हमलों का सामना? – Wortex17

+0

@ वॉर्टेक्स 17: यदि हैकर के पास एक खाता है तो वह उस काउंटर को पुनर्निर्माण करने का प्रयास कर सकता है। इसके अलावा * काउंटर * एक हमला शायद एक खराब शब्द पसंद है। सुरक्षा एक चालू/बंद कहानी नहीं है, बिंदु उचित सीमाओं के भीतर जोखिम न्यूनीकरण करना है। –

13

अच्छे समाधान

यह मानता है कि 256-बिट गैर आवश्यक है।

  1. random_bytes(32) (पीएचपी 7.0.0+)
  2. openssl_random_pseudo_bytes(32)
  3. mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)
  4. # 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 का उपयोग करें।

+0

'/ dev/urandom',' का उपयोग कर, क्योंकि यह उच्च एन्ट्रापी guiarantee की कोशिश करता है/dev/random' दिलचस्प है, तो यह ब्लॉक पढ़ता है जब तक पर्याप्त बिट्स एन्ट्रापी पूल में उपलब्ध हैं के अलावा। –

+1

सर्वर को कहां स्थित है और इस प्रकार "अनुमान" समय क्षेत्र अनुमान लगाकर अनुमानों की संख्या भी कम हो सकती है। अगर कोई कुछ अनुमानित अनुमान बनाता है, तो शायद उसे कम अनुमानों की आवश्यकता होगी। –

+0

@CommuSoft आप निश्चित रूप से सही हैं। वास्तव में, आप शायद इसे 3 से कम प्रयासों में अनुमान लगा सकते हैं। मैंने ऊपरी बाउंड के रूप में 120 की पेशकश की। –

0

यदि मैं एक सेकंड में कई बार अपना पासवर्ड रीसेट करता हूं, तो मुझे पता है कि मुझे एक ही टोकन मिलता है लेकिन हमलावर इसका शोषण कैसे कर सकता है?

आपको यह बात मिली है कि हमलावर को "बहुत से गलत" करना होगा। एक हमलावर कई अलग-अलग सेकंड के लिए अपने टोकन उत्पन्न कर सकता है और अपने खाते के खिलाफ उन सभी को आजमा सकता है।

संबंधित मुद्दे