2013-11-09 11 views
6

मैं PHP में पासवर्ड सुरक्षा पर पढ़ रहा था और मैं एक दिलचस्प बयान पर ठोकर खाई:क्यों हैश अपने हैश के साथ धोया गया है क्योंकि नमक हैश लौटाता है?

अपने हैश के साथ पासवर्ड हैशिंग के रूप में नमक ही हैश

रिटर्न ज्यादा सोच के बिना, मैं चला गया php.net पर और पाया कि यह वही बात कहता है। एक उदाहरण

आइए नज़र:

crypt("test", "test"); -> teH0wLIpW0gyQ 
crypt("test", "teH0wLIpW0gyQ"); -> teH0wLIpW0gyQ 

मैं पूरी तरह PHP में है कि तहखाने को समझ सकता हूँ दिया तार का एक एक तरह से हैश उत्पन्न करता है।

  1. मुझे क्या समझ में नहीं आता है कि हम दो पूरी तरह से अलग नमक का उपयोग करके एक ही हैश आउटपुट कैसे प्राप्त कर सकते हैं?
  2. क्या इसका मतलब यह है कि संभवतः अन्य लवण हैं जो संभवतः मुझे एक ही हैश दे सकते हैं?

अनुवर्ती

आप अपने सभी संकेत के लिए धन्यवाद। अब मैं देख सकता हूं कि डिफ़ॉल्ट व्यवहार केवल नमक के पहले दो अक्षरों का उपयोग करना है, जो मेरे सभी सवालों का पूरी तरह उत्तर देते हैं। एक मूर्ख चीज की तरह लगता है, लेकिन ...

+0

कबूतर सिद्धांत के कारण # 2 का उत्तर मामूली हां है। यह हैश पर निर्मित लगभग हर चीज को प्रभावित करता है और एक अच्छी तरह से इंजीनियर प्रणाली में कोई समस्या नहीं है, क्योंकि एक ही हैश उत्पन्न करने वाले इनपुट में से कोई भी अनुमान लगाने या खोजने के लिए संभव नहीं है। – delnan

+0

# 1 का उत्तर है: यह क्रिप्टोग्राफिक एल्गोरिदम पर निर्भर करता है। वहां उस प्रश्न का कोई सार्वभौमिक उत्तर नहीं है। मुझे 'क्रिप्ट' फ़ंक्शन की अंतर्निहित कार्यप्रणाली नहीं है, लेकिन अगर मैंने किया, तो मुझे संदेह है कि यह एक छोटा जवाब होगा ;-) –

+0

आम तौर पर, हाँ; एक से अधिक नमक हो सकते हैं जो एक ही हैश दे देंगे, लेकिन एक अच्छी तरह से तेल वाली वेबसाइट के साथ, यह चिंता का एक प्रमुख कारण नहीं होना चाहिए –

उत्तर

3

1। जो मुझे समझ में नहीं आता है, हम दो पूरी तरह से अलग लवण का उपयोग करके एक ही हैश आउटपुट कैसे प्राप्त कर सकते हैं?

हालांकि आपने crypt फ़ंक्शन पर अलग-अलग नमक प्रदान किए हैं, यह आंतरिक रूप से उसी नमक का उपयोग करता है, i। ई।, te। यह crypt कैसे कार्यान्वित किया जाता है की वजह से है:

वर्णमाला "./0-9A-Za-z" से एक दो चरित्र नमक के साथ स्टैंडर्ड डेस आधारित हैश।

तो यदि आप 2 अक्षरों से अधिक नमक प्रदान करते हैं तो यह केवल पहले दो ही ले जाएगा।

और जैसा कि crypt के उत्पादन में इस्तेमाल किया नमक, परिकलित हैश के लिए prepended बिल्कुल वैसा ही उत्पादन में नमक परिणाम के रूप में एक crypt हैश का उपयोग कर सकते हैं।और यह बस एक आदर्श के रूप में तो निम्नलिखित एक संग्रहीत पासवर्ड को सत्यापित करने के लिए इस्तेमाल किया जा सकता है:

crypt($password, $hash) === $hash 


2। क्या इसका मतलब यह है कि संभवतः अन्य लवण हैं जो संभवतः मुझे एक ही हैश दे सकते हैं?

हां। This does also apply to other crypt algorithms like bcrypt.

4

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

crypt("test", "test");  -> teH0wLIpW0gyQ 
crypt("test", "te");   -> teH0wLIpW0gyQ 
crypt("test", "tea");   -> teH0wLIpW0gyQ 
crypt("test", "temperature"); -> teH0wLIpW0gyQ 
etc. 

यह आसान पासवर्ड शुद्धता जांच के लिए किया जाता है, ताकि
crypt($password, crypt($password, $salt)) == crypt($password, $salt)

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