2013-06-19 6 views
5

उत्पन्न करता है क्या किसी को किसी भी लंबाई के पास वाक्यांश से उत्पन्न 256 बिट कुंजी मान प्राप्त करने का कोई तरीका पता है? एन्क्रिप्शन को नमकीन नहीं किया जा सकता क्योंकि एन्क्रिप्टेड मानों को फिर से उत्पन्न करने और डेटाबेस में तुलना करने की आवश्यकता होती है। तो एक मान को एन्क्रिप्टेड प्रत्येक बार एन्क्रिप्टेड स्ट्रिंग उत्पन्न करना चाहिए।एईएस 256 बिट कुंजी मान

वर्तमान में मैं संभावित रूप से गलत धारणा पर काम कर रहे 32 चार कुंजी का उपयोग कर रहा हूं यह 256 बिट्स है?

तो, मैं चाहता हूं कि 'त्वरित ब्राउन फॉक्स' को उपयुक्त एईएस 256 बिट कुंजी में परिवर्तित किया जाए?

+2

"एन्क्रिप्शन को नमकीन नहीं किया जा सकता क्योंकि एन्क्रिप्टेड मानों को फिर से उत्पन्न करने की आवश्यकता है" यही कारण है कि नमक को हैश पासवर्ड के साथ स्टोर करना आम है। इस तरह, यदि दो अलग-अलग उपयोगकर्ताओं के पास एक ही पासवर्ड है, तो यह विभिन्न हैंश उत्पन्न करता है, लेकिन एक उपयोगकर्ता के लिए, एक ही पासवर्ड हमेशा एक ही हैश उत्पन्न करेगा। – svick

+0

फ्रैंक होने के लिए, नमक के बिना यह वास्तव में एन्क्रिप्ट नहीं किया गया है। एन्क्रिप्टेड मान के विरुद्ध प्रत्यक्ष डेटाबेस लुकअप करना संभव नहीं होना चाहिए। – Matthew

उत्तर

12

आप एक मनमाना आकार पासवर्ड के साथ Rfc2898DeriveBytes Class निर्माण कर सकते हैं और फिर इस मामले में अपने वांछित आकार के एक कुंजी को प्राप्त, 256 बिट्स (32 बाइट्स):

private static byte[] CreateKey(string password, int keyBytes = 32) 
{ 
    const int Iterations = 300; 
    var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations); 
    return keyGenerator.GetBytes(keyBytes); 
} 

आदेश में एक नियतात्मक उत्पादन का उत्पादन करने के लिए (यानी एक ही इनपुट एक ही आउटपुट का उत्पादन करेगा) आपको नमक को कड़ी मेहनत करने की आवश्यकता होगी।

private static readonly byte[] Salt = 
    new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80}; 
+0

उपर्युक्त के अधिक सैद्धांतिक वर्णन के लिए मेरी व्याख्या देखें। ध्यान दें कि 'Rfc2898DeriveBytes' PBKDF2 लागू करता है :) –

+0

धन्यवाद - यह बहुत उपयोगी था। 32 बाइट कुंजी सरणी प्राप्त करने के लिए कुंजी आकार 32 होना चाहिए? – bhs

+0

हां, मुझे लगता है कि बाइटब्लास्ट की गलती थी। मैं आपको सलाह देता हूं कि यूटीएफ -8 एन्कोडिंग का उपयोग करके बाइट्स को पासवर्ड एन्कोड करने के लिए, क्योंकि Rfc2898DeriveBytes फ़ंक्शन स्पष्ट रूप से उस एन्कोडिंग को निर्दिष्ट नहीं करता है जो इसका उपयोग करता है। जब आप किसी अन्य रनटाइम से फ़ंक्शन का उपयोग करते हैं तो यह मुश्किल होता है। –

-1

आप कुछ हैश फ़ंक्शन का उपयोग कर सकते हैं जो किसी भी लंबाई के इनपुट से 256 बिट आउटपुट प्रदान करता है, उदाहरण के लिए SHA256।

+1

आधिकारिक तौर पर एक हैश पासवर्ड आधारित कुंजी व्युत्पन्न फ़ंक्शन नहीं है, और इसका उपयोग सीधे इस तरह नहीं किया जाना चाहिए। –

2

शायद सबसे अच्छा तरीका है SHA256 (जो 256 बिट उत्पादन उत्पन्न होगा) और एक आवेदन विशिष्ट नमक & पुनरावृत्ति संख्या का उपयोग कर PBKDF2 उपयोग करने के लिए है: नमक कम से कम 8 बाइट्स होना चाहिए। आपको अवगत होना चाहिए कि एक आवेदन विशिष्ट नमक का उपयोग करके पीबीकेडीएफ 2 से बहुत सारी सुरक्षा हटा दी गई है, इसलिए आपको इस मुद्दे को कम करने के लिए अतिरिक्त सुरक्षा की आवश्यकता हो सकती है। एक तरीका यह सुनिश्चित करना होगा कि डेटाबेस सुरक्षित है, और अधिकतम प्रयासों का उपयोग किया जा सकता है।

आप यह निर्धारित करने में सही हैं कि 32 char passphrase 256 बिट कुंजी नहीं है। इसमें पर्याप्त एन्ट्रॉपी नहीं है, और कुछ बाइट्स में वैध वर्ण प्रस्तुतिकरण भी नहीं हो सकते हैं।

+0

बाइटब्लॉस्ट्स को उपर्युक्त कार्यान्वयन के लिए उत्तर दें :) –

+0

धन्यवाद - तो उपर्युक्त विधि से 32 बाइट सरणी 256 बिट कुंजी है? – bhs

+0

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

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