2012-05-14 23 views
24

मैं इस कोड को ज़ेंड फ्रेमवर्क की HTTP एथ लाइब्रेरी में मिला हूं। ऐसा लगता है कि इसे अधिक सुरक्षित बनाने के लिए एक विशेष स्ट्रिंग तुलना फ़ंक्शन का उपयोग करना प्रतीत होता है। हालांकि, मैं टिप्पणियों को काफी समझ नहीं पा रहा हूं। क्या कोई यह समझा सकता है कि यह कार्य $a == $b करने से अधिक सुरक्षित क्यों है?सुरक्षित स्ट्रिंग फ़ंक्शन की तुलना करें

/** 
* Securely compare two strings for equality while avoided C level memcmp() 
* optimisations capable of leaking timing information useful to an attacker 
* attempting to iteratively guess the unknown string (e.g. password) being 
* compared against. 
* 
* @param string $a 
* @param string $b 
* @return bool 
*/ 
protected function _secureStringCompare($a, $b) 
{ 
    if (strlen($a) !== strlen($b)) { 
     return false; 
    } 
    $result = 0; 
    for ($i = 0; $i < strlen($a); $i++) { 
     $result |= ord($a[$i])^ord($b[$i]); 
    } 
    return $result == 0; 
} 
+0

यह है कि वास्तव में PHP 5.6+ – caw

उत्तर

36

ऐसा लगता है कि वे timing attacks को रोकने की कोशिश कर रहे हैं।

क्रिप्टोग्राफी में, एक समय हमला एक पक्ष चैनल हमले जिसमें हमलावर समय क्रिप्टोग्राफिक एल्गोरिथम निष्पादित करने के लिए ले जाया विश्लेषण करके एक क्रिप्टो समझौता करने का प्रयास करता है। कंप्यूटर में प्रत्येक लॉजिकल ऑपरेशन को निष्पादित करने में समय लगता है, और समय इनपुट के आधार पर भिन्न हो सकता है; प्रत्येक ऑपरेशन के लिए समय के सटीक माप के साथ, एक हमलावर इनपुट के लिए पीछे की ओर काम कर सकता है।

असल में, यदि सही पासवर्ड और गलत पासवर्ड की तुलना करने में अलग-अलग समय लगता है, तो आप यह पता लगाने के लिए समय का उपयोग कर सकते हैं कि आपने कितने पासवर्ड सही तरीके से अनुमान लगाए हैं।

(एक स्पष्ट wait जोड़ा के साथ इस मूल रूप से सामान्य स्ट्रिंग समानता समारोह है,) एक अत्यंत दोषपूर्ण स्ट्रिंग तुलना पर विचार करें:

function compare(a, b) { 
    if(len(a) !== len(b)) { 
     return false; 
    } 
    for(i = 0; i < len(a); ++i) { 
     if(a[i] !== b[i]) { 
      return false; 
     } 
     wait(10); // wait 10 ms 
    } 
    return true; 
} 

आप एक पासवर्ड देने के लिए और यह (लगातार) के लिए कुछ समय तक ले जाता है कहो एक पासवर्ड, और लगभग 10 एमएस दूसरे के लिए लंबा है। यह आपको क्या कहता है? इसका मतलब है कि दूसरे पासवर्ड में पहले अक्षर की तुलना में एक और चरित्र सही है।

यह आपको फिल्म हैकिंग करने देता है - जहां आप एक समय में एक चरित्र एक पासवर्ड का अनुमान लगाते हैं (जो हर संभव पासवर्ड अनुमान लगाने से कहीं अधिक आसान है)।

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

इस समारोह अभी भी एक छोटी सी समस्या यहां है:

if(strlen($a) !== strlen($b)) { 
    return false; 
} 

यह मदद से आप समय हमलों आप किसी भी कम या लंबी पासवर्ड अनुमान लगा नहीं परेशान करने देता है जो पासवर्ड की सही लंबाई, यह पता लगाने के लिए उपयोग। आम तौर पर, you want to hash your passwords पहले (जो बराबर लंबाई तार बना देगा), इसलिए मुझे लगता है कि उन्होंने इसे एक समस्या नहीं माना है।

+1

में 'हैश_equals' करता है। "वहां मत जाओ क्योंकि यह खतरनाक है, लेकिन वैसे भी वहां जाएं, क्योंकि यह एकमात्र सड़क है" –

+1

दिलचस्प, लेकिन पूरी तरह गलत है। – rook

+0

@rook - यह सही क्यों है? कोड में टिप्पणियों से, यही वह है जो ज़ेंड हासिल करने की कोशिश कर रहा है। – iWantSimpleLife

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