एनपी पूरी समस्याओं का उपयोग करके पासवर्ड हैशिंग


16

आमतौर पर इस्तेमाल किया जाने वाला पासवर्ड हैशिंग एल्गोरिदम आज भी इसी तरह काम करता है: पासवर्ड को नमक करें और इसे केडीएफ में फीड करें। उदाहरण के लिए, 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 समस्या उदाहरण उत्पन्न करता है।


इस लंबे परिचय के बाद, आखिरकार मेरे सवाल:

  1. क्या उपरोक्त निर्माण (प्रोटोटाइप में लागू किया गया) सुरक्षित पासवर्ड हैशिंग के रूप में काम करता है, या कम से कम आशाजनक दिखता है, संशोधित किया जा सकता है, आदि? यदि नहीं, तो यह विफल कहाँ है?

  2. क्योंकि हमारे पास चुनने के लिए 7 * C (n, 3) क्लॉज़ हैं, क्या पासवर्ड हैश के रूप में उपयोग के लिए उपयुक्त 3-SAT उदाहरण का निर्माण करने के लिए एक और तरीका खोजना संभव है, संभवतः रैंडमाइजेशन की मदद से?

  3. क्या कोई समान कार्य एनपी पूर्णता का लाभ उठाने की कोशिश कर रहा है ताकि साबित पासवर्ड हैशिंग योजनाओं को डिजाइन किया जा सके, और पहले से ही कुछ परिणाम (या तो सकारात्मक या नकारात्मक) मिले? कुछ इंट्रो और लिंक का बहुत स्वागत होगा।


संपादित करें। मैं @DW द्वारा नीचे दिए गए उत्तर को स्वीकार करूंगा, जो उत्तर देने वाला पहला व्यक्ति था और समस्या संरचना के साथ-साथ उपयोगी संसाधनों के बारे में भी बहुत जानकारी देता था। यहां पेश की गई भोली-भाली चयन योजना (जैसा कि पायथन प्रोटोटाइप में लागू की गई है) काम नहीं करती थी क्योंकि छोटे समूहों में चर असाइनमेंट को जल्दी से कम करना संभव है। हालाँकि, समस्या खुली हुई है क्योंकि मैंने ऐसा एनपीसी-पासवर्ड-पासवर्डहैशिंग कटौती दिखाने वाला औपचारिक प्रमाण नहीं देखा है, जो बिल्कुल भी काम नहीं करेगा। यहां तक ​​कि इस विशिष्ट 3-सैट की कमी की समस्या के लिए, क्लॉज चुनने के विभिन्न तरीके हो सकते हैं, जिन्हें मैं यहां नहीं बताना चाहता हूं। तो किसी भी अद्यतन और चर्चा अभी भी बहुत स्वागत है।


मैं एक करने के लिए अपने खंड पीढ़ी solver बैठे थे (pycosat का उपयोग कर picosat) खामियों को दूर यहाँ । नोड्स के लिए = 300 सबसे लंबा क्लॉज उत्पन्न करने के लिए है, पाइकोसेट उदाहरण को मारता है। मैं 300 से अधिक नहीं गया क्योंकि आपकी खंड पीढ़ी वास्तव में बहुत लंबी है। इसके अलावा, 0 ... 0 आपकी पीढ़ी में हमेशा एक समाधान है। यदि आपके पास हमेशा इस तरह के 'आसान' समाधान हैं, तो यह काम नहीं करेगा।
होली

जवाबों:


17

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

अपने सामान्य विचार के साथ समस्या

आप एनपी-पूर्ण समस्याओं पर क्रिप्टोग्राफी को आधार बनाने की कोशिश करने के विचार के बारे में सोचने वाले पहले व्यक्ति नहीं हैं। समस्या यह है कि एनपी-कठोरता केवल सबसे खराब स्थिति सुनिश्चित करती है, लेकिन क्रिप्टोग्राफी के लिए औसत-केस कठोरता की आवश्यकता होती है। एनपी-पूर्ण समस्याओं (उदाहरण के लिए, क्रिप्टोस क्रिप्टो सिस्टम) पर क्रिप्टोग्राफी को आधार बनाने के कई प्रयास किए गए हैं, लेकिन वे अच्छी तरह से सफल नहीं हुए हैं। आमतौर पर ऐसा होता है कि लोग एल्गोरिदम की खोज करते हैं जो अक्सर औसत पर (या गैर-तुच्छ संभावना के साथ) प्रभावी होते हैं, भले ही सबसे खराब स्थिति में वे घातीय हों; यह क्रिप्टो को तोड़ने के लिए पर्याप्त है, भले ही यह एनपी-कठोरता का खंडन नहीं करता है।

मैं विषय के बारे में अधिक पढ़ने का सुझाव देता हूं। आप क्रिप्टोग्राफी में एनपी-हार्ड समस्याओं के महत्व पर कुछ उपयोगी शुरुआती बिंदु पा सकते हैं , औसत-मामले की जटिलता एक-तरफ़ा कार्यों के अलावा अन्य समस्याओं को खोलती है , इम्पेग्लियाज़ो के संसारों की स्थिति? , औसत मामले में कटौती के लिए सबसे खराब मामला

आपकी विशेष योजना के साथ समस्या

आपका विशिष्ट प्रस्ताव पूरी तरह से निर्दिष्ट नहीं है। किसी योजना का विश्लेषण करने के लिए, आपको पूरी तरह से यह निर्दिष्ट करने की आवश्यकता है कि योजना कैसे काम करती है। आपके मामले में, यह स्पष्ट नहीं है कि आप सामान्य उदाहरण में 7 खंडों में से 4 का चयन कैसे करते हैं। (और एक उदाहरण एक विनिर्देश के लिए एक विकल्प नहीं है जो यह बताता है कि आप इसे सामान्य रूप से कैसे करते हैं।)

एक्स0,एक्स1,एक्स2,एक्स3,एक्स425उन 5 चर के लिए संभव असाइनमेंट, इसलिए उन सभी को आज़माएं और 40 खंडों में से किसी भी उल्लंघन का उल्लंघन करने वाले किसी भी असाइनमेंट को छोड़ दें। मैं भविष्यवाणी करता हूं कि यह आपको केवल एक असाइनमेंट के बारे में छोड़ देगा जो सभी खंडों के अनुरूप है।

1/21/21025-17/8(7/8)402-7.7(25-1)×2-7.70.15

यह 5 चर के प्रत्येक समूह के लिए दोहराया जा सकता है, विशिष्ट रूप से प्रत्येक के लिए अद्वितीय संतोषजनक असाइनमेंट को पुनर्प्राप्त कर सकता है। यदि कोई अस्पष्टता है, तो उम्मीदवार के असाइनमेंट को अन्य क्लॉस के खिलाफ चेक किया जा सकता है।

इस तरह, हम देखते हैं कि एक कुशल एल्गोरिथ्म है जो आमतौर पर आपकी प्रक्रिया द्वारा उत्पन्न 3SAT इंस्टेंस के वर्ग को हल करेगा। यह सभी 3SAT इंस्टेंस को हल नहीं करेगा, लेकिन आपके द्वारा उत्पन्न इंस्टेंस में एक विशेष संरचना होती है, और यह उस विशेष संरचना के साथ इंस्टेंस को प्रभावी ढंग से हल करता है। इस बिंदु को अच्छी तरह से दर्शाता है: 3SAT के कुछ उदाहरण दूसरों की तुलना में आसान हैं, और 3SAT की कठोरता (सबसे खराब स्थिति में) आपके द्वारा उत्पन्न विशेष उदाहरणों की कठोरता या औसत 3SAT उदाहरण की कठोरता के बारे में बहुत कम या कुछ भी नहीं कहती है।


एक संदर्भ कार्यान्वयन है जो पूर्ण कल्पना के रूप में कार्य करता है। इस पहले प्रयास में, यह योजना वास्तव में सरल है। मैंने केवल उन 4 क्लॉस को चुना है जो पासवर्ड में प्रतिस्थापित करते समय 001, 010, 100 और 111 देगा। यह प्रत्येक खंड के लिए 8 में से 4 मान्य संयोजन देता है।
साइकर

आप शायद सही हैं कि यह जल्दी हालांकि बहुत अधिक क्लॉज़ देता है जो समाधान को तेज़ी से कम करना संभव बनाता है। हालाँकि, हम O (n ^ 3) क्लाज से शुरू करते हैं और हम यह चुनने के लिए स्वतंत्र हैं कि किसे रखा जाए। ट्रिपल स्वतंत्र नहीं हो सकते हैं। इसलिए मैं सोच रहा हूं कि क्या खंडों को एक ऐसे पैटर्न के साथ चुना जाता है जो आसान समस्या उदाहरणों को हटाने की कोशिश करता है, चाहे आपका विश्लेषण अभी भी हो।
साइकर

1
लेकिन अधिक दिलचस्प बात यह है कि मोटे तौर पर, हमारे पास कोई औसत-मामला एनपीसी समस्या नहीं है?
साइकर

1
@Cyker, आप बिल्कुल सही कह रहे हैं। कड़ाई से बोलते हुए, आप संभावनाओं को गुणा नहीं कर सकते क्योंकि कोई गारंटी नहीं है कि संभावनाएं स्वतंत्र हैं। एल्गोरिथ्म कितनी अच्छी तरह काम कर सकता है, यह अनुमान लगाने की कोशिश करने के लिए यह सिर्फ एक अनुमान है। हेयुरिस्टिक गलत हो सकता है। अंतिम परीक्षण एल्गोरिथ्म को लागू करना है और देखना है कि यह काम करता है या नहीं।
DW

2
एक त्वरित परीक्षण आपके उदाहरणों को सैट सॉल्वर पर आजमा सकता है। मुझे लगता है कि एसएटी सॉल्वर्स आपके उदाहरणों पर कुशल होगा लेकिन मैंने आपकी कल्पना को समझने की पूरी कोशिश नहीं की। 10000 चर उदाहरण उत्पन्न करने और सैट सॉल्वर चलाने का प्रयास करें (वैसे, बिना पैडिंग /
सैल्टिंग के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.