2012-11-30 18 views
8

में पासवर्ड और नमक के लिए हैश उत्पन्न करने के लिए स्क्रिप का उपयोग कैसे करें मैं अपने उपयोगकर्ताओं के पासवर्ड और लवण के लिए हैश बनाने के लिए स्क्रिप का उपयोग करना चाहता हूं। मुझे tworeferences मिला है, लेकिन ऐसी चीजें हैं जिन्हें मैं उनके बारे में नहीं समझता।पायथन

वे स्क्रिप एन्क्रिप्ट और डिक्रिप्ट फ़ंक्शंस का उपयोग करते हैं। एक यादृच्छिक स्ट्रिंग को एन्क्रिप्ट करता है और दूसरा नमक को एन्क्रिप्ट करता है (जो केवल पासवर्ड से गलत दिखता है और नमक का उपयोग डिक्रिप्शन के लिए नहीं किया जाता है)। ऐसा लगता है कि डिक्रिप्ट फ़ंक्शन का उपयोग पासवर्ड/नमक को डिक्रिप्शन के दुष्प्रभाव के रूप में सत्यापित करने के लिए किया जा रहा है।

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

उत्तर

9

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

स्क्रिप फ़ाइल उपयोगिता निम्न कार्य करती है: आपके सिस्टम & "न्यूनतम समय" पैरामीटर के लिए विशिष्ट स्क्रिप के एन/आर/पी पैरामीटर चुनती है। यह तब 32 बाइट नमक उत्पन्न करता है, और फिर 64 बाइट कुंजी बनाने के लिए scrypt(n,r,p,salt,pwd) पर कॉल करता है। द्विआधारी स्ट्रिंग उपकरण रिटर्न से बना है: 1) एक हेडर जिसमें एन, आर, पी मान, और बाइनरी में एन्कोडेड नमक होता है; 2) शीर्षलेख का sha256 चेकसम; और 3) कुंजी के पहले 32 बाइट्स का उपयोग करके चेकसम के एक एचएमएसी-शाए 256 हस्ताक्षरित प्रति। उसके बाद, यह इनपुट डेटा को एईएस एन्क्रिप्ट करने के लिए कुंजी के शेष 32 बाइट्स का उपयोग करता है।() एक नया नमक उत्पन्न

  1. इनपुट डेटा व्यर्थ है, क्योंकि यह वास्तव में नमक को प्रभावित नहीं करता इस्तेमाल किया जा रहा है, और एन्क्रिप्ट:

    इस के निहितार्थ है कि मैं देख सकता हूँ के एक जोड़े हैं हर बार।

  2. आप एन, आर, पी वर्कलोड मैन्युअल रूप से या किसी अन्य तरीके से कॉन्फ़िगर नहीं कर सकते हैं लेकिन अजीब मिनट-समय पैरामीटर। यह असुरक्षित नहीं है, लेकिन कार्य कारक को नियंत्रित करने के लिए एक अजीब तरीका है।

  3. के बाद डिक्रिप्ट कॉल कुंजी पुन: बनाता है और HMAC के खिलाफ यह तुलना, यह सही वहाँ सब कुछ को अस्वीकार कर देंगे, तो आपका पासवर्ड गलत है - लेकिन अगर यह सही है, यह पर आगे बढ़ेंगे भी डेटा पैकेज डिक्रिप्ट। यह बहुत अधिक काम है जिसे हमलावर को प्रदर्शन नहीं करना पड़ेगा - उन्हें 64 बाइट्स भी प्राप्त नहीं करना है, केवल 32 हस्ताक्षर की जांच करने के लिए आवश्यक है। यह समस्या असुरक्षित बिल्कुल ठीक नहीं करती है, लेकिन काम करने से आपका हमलावर कभी वांछनीय नहीं होता है।

  4. नमक कुंजी, व्युत्पन्न कुंजी आकार इत्यादि को कॉन्फ़िगर करने का कोई तरीका नहीं है, वर्तमान मान खराब नहीं हैं, लेकिन फिर भी, यह आदर्श नहीं है।

  5. डिक्रिप्ट उपयोगिता की "अधिकतम समय" सीमा पासवर्ड हैशिंग के लिए गलत है - प्रत्येक बार डिक्रिप्ट कहा जाता है, यह आपके सिस्टम की गति का अनुमान लगाता है, और कुछ "अनुमान लगाता है" कि यह अधिकतम समय के भीतर कुंजी की गणना कर सकता है - अधिक ओवरहेड आपके हमलावर को नहीं करना है (देखें # 3), लेकिन इसका मतलब यह भी है कि डिक्रिप्ट भारी सिस्टम लोड के तहत पासवर्ड को अस्वीकार करना शुरू कर सकता है।यहां तक ​​कि लिंक करने के लिए निर्यात नहीं -

  6. मुझे यकीन है कि क्यों कॉलिन पर्सिवल KDF & पैरामीटर-चुनने सार्वजनिक एपीआई के कोड हिस्सा नहीं था, लेकिन यह वास्तव में स्पष्ट रूप से चिह्नित किया गया है "निजी" स्रोत कोड के अंदर नहीं कर रहा हूँ । यह मुझे बहुत अधिक अध्ययन किए बिना सीधे पहुंचने में संकोच करता है।

सभी में

सभी, क्या जरूरत है एक अच्छा हैश प्रारूप कि scrypt स्टोर कर सकते हैं, और एक कार्यान्वयन कि अंतर्निहित KDF और पैरामीटर-चुनने एल्गोरिथ्म को उजागर करता है। मैं वर्तमान में passlib के लिए इस पर काम कर रहा हूं, लेकिन इसने अधिक ध्यान नहीं देखा है :(

बस नीचे की रेखाओं के नीचे - उन साइट के निर्देश 'ठीक' हैं, मैं बस एक खाली स्ट्रिंग का उपयोग करता हूं फ़ाइल सामग्री, और अतिरिक्त भूमि के ऊपर और मुद्दों के बारे में पता होना

+0

धन्यवाद। मैंने कुछ डिक्रिप्ट का समय दिया और वे एक चरित्र तारों के लिए भी अत्यधिक परिवर्तनीय और समय लेने वाली लगते हैं। अन्य मुद्दों के साथ मैं रह सकता था, लेकिन यह नहीं जानना कि किस मूल्य को रखना है ताकि डिक्रिप्शन वापस नहीं आएगा "डिक्रिप्टिंग फ़ाइल में बहुत लंबा समय लगेगा " त्रुटि यह मेरे लिए अनुपयोगी बनाती है। bcrypt बहुत अधिक दोस्ताना दिखता है और शायद मेरे लिए ठीक होगा। – Mitch

4

उन संदर्भों के दोनों यह पूरी तरह से गलत encrypt और decrypt साथ गंदगी नहीं है:।। बस hash

का उपयोग KDF सीधे संपर्क में नहीं है , लेकिन hash काफी करीब है। (वास्तव में, यह मुझे बेहतर होने लगता है, क्योंकि यह मिश्रण करता है एक पीबीकेडीएफ 2 सैंडविच भरना।)

This example code दोनों पायथन 2.7 और पायथन 3.2 के साथ काम करता है। यह PyCrypto, passlib, और py-scrypt का उपयोग करता है, लेकिन केवल को py-scrypt की आवश्यकता है।

आप समय-समय पर हमलों को कम करने के लिए passlib.utils.consteq जैसे एक प्रतियोगी-समय तुलना फ़ंक्शन का उपयोग करना चाहेंगे।

आप पैरामीटर को ध्यान से चुनना भी चाहेंगे। डिफ़ॉल्ट लॉगएन = 14, आर = 8, पी = 1 मतलब 16 एमआईबी स्मृति का उपयोग कर 1 "गोल" है। एक सर्वर पर, शायद आप कुछ और अधिक चाहते हैं जैसे 10,8,8 - कम रैम, अधिक सीपीयू। आपको पर अपने हार्डवेयर पर अपेक्षित लोड के समय का समय चाहिए।