2015-04-07 7 views
5

मैं password_verify() समय-समय पर हमले से बचने के लिए लंबाई-निरंतर समय तुलना का उपयोग करने के बारे में जानकारी खोजने का प्रयास कर रहा हूं।PHP password_verify() और धीमी तुलना तुलनात्मक

अब, सरल उदाहरण:

$hash = '$2y$10$HH3906lfby7HOy1N3duQh.Kju.84ct6AcMZm2p/SYZsZSXuYWvvT.'; 

$startTime = microtime(TRUE); 
password_verify('rasmuslerdorf', $hash); 
$endTime = microtime(TRUE); 

$time = $endTime - $startTime; 

यह हमेशा थोड़ा अलग उत्पादन है, जो, this article (के अनुसार लंबाई-निरंतर "समय" क्यों इस पृष्ठ पर हैशिंग कोड हैश में तुलना "पैदा करता है? " अनुच्छेद), एक हैश लेने के लिए समय पर हमले में इस्तेमाल किया जा सकता है। मुझे लगता है कि वे परिणाम थोड़ा यादृच्छिक दिखते हैं, लेकिन वे निश्चित रूप से स्थिर नहीं हैं।

प्रश्न है, password_verify() समय पर हमले से बचने के लिए लंबाई-निरंतर समय तुलना का उपयोग करता है? दस्तावेज़ों में इसकी कोई जानकारी नहीं है, और मेरे उथले अनुभव के कारण मैं फ़ंक्शन प्रोसेसिंग समय परिणामों की व्याख्या नहीं कर सकता।

उत्तर

8

उत्तर है हाँ यह लंबाई-निरंतर समय तुलना का उपयोग करता है।

यह php के password_verify समारोह का एक अंश

/* We're using this method instead of == in order to provide 
* resistance towards timing attacks. This is a constant time 
* equality check that will always check every byte of both 
* values. */ 
for (i = 0; i < hash_len; i++) { 
    status |= (ret->val[i]^hash[i]); 
} 

आप https://github.com/php/php-src/blob/master/ext/standard/password.c

+0

धन्यवाद! पहले इस रेपो को कभी नहीं देखा। – Nevertheless

4

लघु जवाब में पूर्ण स्रोत कोड पर एक नज़र हो सकता है: हाँ, यह करता है।

लंबा उत्तर: यह आवश्यक नहीं है। तुलना की जा रही

को समझने के लिए क्यों यह आवश्यक नहीं है, हम तार को देखने के लिए की जरूरत है:

$2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 
$2y$10$ILlWQrYyDJvHHkxcCgjm7OThLRAmMcTzsJOZOwjaSYiRUHq8LVYde 
$2y$10$8JfydDKUNbOeiybwZ9m.j.5TC8CBqkc3RZu2DX42A4dFNpNYPWfzm 
$2y$10$qeG.53lr9PVVGN4Yk.kSZuOMpfone5kINyWVpAf2gUXPseU2WdSzK 
$2y$10$nZUgPUwiXIvCJ9BY1wbtbuV5vH6yff9CNyumFsI/NN2eJmf20iec. 

एक ही पासवर्ड का 5 अलग हैश है यही कारण है कि। प्रारूप है:

$2y$10$saltsaltsaltsaltsaltsahashhashhashhashhashhashhashhas 

अब, एक दूरस्थ हमलावर (जो समय पर हमला करेगा), नमक एक रहस्य है। और नमक वही होता है जब हम उनकी कोशिश फिर से करते हैं। उदाहरण के लिए: हमलावर पासवर्ड "abc" की कोशिश करता है

stored password "test": 
hash = $2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 

हैं, तो आंतरिक रूप से password_verify()crypt("abc", hash) कॉल करेंगे। कौन सा परिणाम देगा में:

$2y$10$9JxHB8U1QKsLS/ynplKzm.iIO7f6gtTKYA61ppVuANYxWNCA5DW1S 
$2y$10$9JxHB8U1QKsLS/ynplKzm.FTYpGS/gNDw4SB6YD0wEtCSPgGvtPim 

सूचना नमक एक ही है:

$2y$10$9JxHB8U1QKsLS/ynplKzm.FTYpGS/gNDw4SB6YD0wEtCSPgGvtPim 

अब, चलो कंधे से कंधा मिलाकर, उन दो हैश को देखो? ध्यान दें कि पहले . तक सबकुछ समान है। यह भी ध्यान दें कि हमलावर को पता नहीं है कि नमक क्या है।

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

तो समय सुरक्षा सुरक्षा कड़ाई से जरूरी नहीं है।

तब इसमें क्यों शामिल है? क्योंकि हर कोई गलती करता है। क्योंकि रक्षा-गहराई एक अच्छा विचार है।चूंकि यह विश्लेषण मानता है कि हैश के बारे में कुछ भी नमक के बिना उपयोगी नहीं है (उदा: क्या होगा अगर बैक्रीप में दोष में पासवर्ड के आधार पर हैंश को पक्षपात किया गया हो, तो नमक को जानने के बिना कुंजीपटल 72^255 से कम हो जाता है)।

संक्षेप में, यह एक अच्छी बात है, लेकिन यह कड़ाई से जरूरी नहीं है ...

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