आमतौर पर इस्तेमाल किया जाने वाला पासवर्ड हैशिंग एल्गोरिदम आज भी इसी तरह काम करता है: पासवर्ड को नमक करें और इसे केडीएफ में फीड करें। उदाहरण के लिए, PBKDF2-HMAC-SHA1 का उपयोग करते हुए, पासवर्ड हैशिंग प्रक्रिया है DK = PBKDF2(HMAC, Password, Salt, ...)
। क्योंकि HMAC गद्देदार चाबियों के साथ एक 2-राउंड हैशिंग है, और SHA1 क्रमपरिवर्तन, पारियों, घुमावों और बिटवाइज़ संचालन की एक श्रृंखला है, मौलिक रूप से, पूरी प्रक्रिया एक निश्चित तरीके से आयोजित कुछ बुनियादी संचालन है। यह स्पष्ट नहीं है, मौलिक रूप से, वे वास्तव में गणना करना कितना कठिन हैं। शायद इसीलिए वन-वे फ़ंक्शंस अभी भी एक विश्वास है और हमने कुछ ऐतिहासिक रूप से महत्वपूर्ण क्रिप्टोग्राफ़िक हैश फ़ंक्शंस असुरक्षित और पदावनत होते देखा है।
मैं सोच रहा था कि क्या यह एक नए तरीके से हैश पासवर्ड में एनपी पूरी समस्याओं का लाभ उठाने के लिए संभव है, इसे और अधिक ठोस सैद्धांतिक नींव देने की उम्मीद है। मुख्य विचार है, मान लीजिए पी! = एनपी (यदि पी = = एनपी तो कोई ओडब्ल्यूएफ नहीं है तो वर्तमान योजनाओं को भी तोड़ दें), एनपीसी समस्या होने का मतलब है कि उत्तर को सत्यापित करना आसान है लेकिन गणना करना कठिन है। यह संपत्ति पासवर्ड हैशिंग की आवश्यकताओं के साथ अच्छी तरह से फिट बैठती है। यदि हम पासवर्ड को एनपीसी समस्या के उत्तर के रूप में देखते हैं, तो हम एनपीसी समस्या को ऑफ़लाइन हमलों का सामना करने के लिए पासवर्ड के हैश के रूप में संग्रहीत कर सकते हैं : पासवर्ड को सत्यापित करना आसान है, लेकिन दरार करना मुश्किल है।
कैविएट है, एक ही पासवर्ड एनपीसी समस्या के कई उदाहरणों के लिए मैप किया जा सकता है, शायद उन सभी को हल करना मुश्किल नहीं है। इस शोध में पहले कदम के रूप में, मैं 3-सैट समस्या के जवाब के रूप में एक बाइनरी स्ट्रिंग की व्याख्या करने की कोशिश कर रहा था, और 3-सैट समस्या का एक उदाहरण बनाने के लिए जिसमें बाइनरी स्ट्रिंग एक समाधान है। अपने सरलतम रूप में, बाइनरी स्ट्रिंग में 3 बिट्स हैं: x_0, x_1, x_2। फिर 2 ^ 3 == 8 खंड हैं:
000 ( (x_0) v (x_1) v (x_2) )
--------------------------------------
001 ( (x_0) v (x_1) v NOT(x_2) )
010 ( (x_0) v NOT(x_1) v (x_2) )
011 ( (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v (x_1) v (x_2) )
101 ( NOT(x_0) v (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )
मान लीजिए कि द्विआधारी स्ट्रिंग 000 है। तब 8 में से केवल 1 खंड गलत है (पहला वाला)। यदि हम पहले खंड को और शेष 7 खंडों को त्याग देते हैं, तो 000 परिणामी सूत्र का एक समाधान है। इसलिए यदि हम सूत्र को स्टोर करते हैं, तो हम 000 को सत्यापित कर सकते हैं।
समस्या यह है कि 3-बिट स्ट्रिंग के लिए, यदि आप वहां 7 अलग-अलग खंड देखते हैं, तो आप तुरंत जानते हैं कि कौन सा गायब है, और यह बिट्स को प्रकट करेगा।
इसलिए बाद में मैंने उनमें से 3 को त्यागने का फैसला किया, केवल 4 को 001, 010, 100 और 111 द्वारा चिह्नित किया। यह कभी-कभी टकराव का परिचय देता है लेकिन समस्या को कम तुच्छ बना देता है। टक्कर हमेशा नहीं होती है, लेकिन क्या वे निश्चित रूप से गायब हो जाएंगे जब इनपुट में अधिक बिट्स होंगे अभी तक ज्ञात नहीं है।
संपादित करें। सामान्य मामले में जहां बाइनरी स्ट्रिंग (000, 001, ..., 111) में से कोई भी हो सकता है, अभी भी 8 खंड हैं जहां 7 सत्य हैं और 1 गलत है। सत्य मान (001, 010, 100, 111) देने वाले 4 खंडों को चुनें। यह नीचे प्रोटोटाइप कार्यान्वयन में परिलक्षित होता है।
संपादित करें। नीचे दिए गए @DW द्वारा दिखाए गए उत्तर के अनुसार, क्लॉज़ चुनने की इस विधि के परिणामस्वरूप, चर के दिए गए सेट पर बहुत अधिक क्लॉज़ हो सकते हैं, जो उनके मूल्यों को जल्दी से कम करना संभव बनाता है। कुल 7 * C (n, 3) खंडों में से धाराएँ चुनने की वैकल्पिक विधियाँ हैं। उदाहरण के लिए: किसी दिए गए वेरिएबल्स के सेट से भिन्न संख्याएँ चुनें, और ऐसा केवल आस-पास के चर ((x_0, x_1, x_2), (x_1, x_2, x_3), (x_2, x_3, x_4) के लिए करें .. ।) और इस प्रकार एक गुच्छ के बजाय एक चक्र बनाते हैं। यह विधि संभवतः ठीक से काम नहीं कर रही है क्योंकि आप सहजता से परीक्षण के लिए प्रेरण का उपयोग करके असाइनमेंट की कोशिश कर सकते हैं कि क्या सभी खंड संतुष्ट हो सकते हैं। तो इसे सरल बनाने के लिए समग्र संरचना की व्याख्या करते हुए चलो वर्तमान विधि का उपयोग करें।
एन-बिट स्ट्रिंग के लिए खंडों की संख्या 4 * C (n, 3) = 4 * n * (n - 1) * (n - 2) / 6 = O (n ^ 3) है, जिसका अर्थ है आकार हैश पासवर्ड के आकार का बहुपद है।
यहां पायथन में एक प्रोटोटाइप कार्यान्वयन है । यह एक उपयोगकर्ता इनपुट बाइनरी स्ट्रिंग से 3-SAT समस्या उदाहरण उत्पन्न करता है।
इस लंबे परिचय के बाद, आखिरकार मेरे सवाल:
क्या उपरोक्त निर्माण (प्रोटोटाइप में लागू किया गया) सुरक्षित पासवर्ड हैशिंग के रूप में काम करता है, या कम से कम आशाजनक दिखता है, संशोधित किया जा सकता है, आदि? यदि नहीं, तो यह विफल कहाँ है?
क्योंकि हमारे पास चुनने के लिए 7 * C (n, 3) क्लॉज़ हैं, क्या पासवर्ड हैश के रूप में उपयोग के लिए उपयुक्त 3-SAT उदाहरण का निर्माण करने के लिए एक और तरीका खोजना संभव है, संभवतः रैंडमाइजेशन की मदद से?
क्या कोई समान कार्य एनपी पूर्णता का लाभ उठाने की कोशिश कर रहा है ताकि साबित पासवर्ड हैशिंग योजनाओं को डिजाइन किया जा सके, और पहले से ही कुछ परिणाम (या तो सकारात्मक या नकारात्मक) मिले? कुछ इंट्रो और लिंक का बहुत स्वागत होगा।
संपादित करें। मैं @DW द्वारा नीचे दिए गए उत्तर को स्वीकार करूंगा, जो उत्तर देने वाला पहला व्यक्ति था और समस्या संरचना के साथ-साथ उपयोगी संसाधनों के बारे में भी बहुत जानकारी देता था। यहां पेश की गई भोली-भाली चयन योजना (जैसा कि पायथन प्रोटोटाइप में लागू की गई है) काम नहीं करती थी क्योंकि छोटे समूहों में चर असाइनमेंट को जल्दी से कम करना संभव है। हालाँकि, समस्या खुली हुई है क्योंकि मैंने ऐसा एनपीसी-पासवर्ड-पासवर्डहैशिंग कटौती दिखाने वाला औपचारिक प्रमाण नहीं देखा है, जो बिल्कुल भी काम नहीं करेगा। यहां तक कि इस विशिष्ट 3-सैट की कमी की समस्या के लिए, क्लॉज चुनने के विभिन्न तरीके हो सकते हैं, जिन्हें मैं यहां नहीं बताना चाहता हूं। तो किसी भी अद्यतन और चर्चा अभी भी बहुत स्वागत है।