2012-02-10 23 views
7

मैं सी # में कोड निम्नलिखित हैसी # PasswordDeriveBytes भ्रम

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations); 
byte[] KeyBytes = DerivedPassword.GetBytes(32); 

मैं "SHA1" का उपयोग कर रहा एल्गोरिथ्म hashing।

SHA1 परिभाषा के अनुसार, यह 160 बिट्स (20 बाइट्स) कुंजी उत्पन्न करता है। मेरा सवाल यह है कि GetBytes विधि को DerivedPassword से 32 बाइट कैसे प्राप्त होते हैं, GetBytes विधि के पीछे क्या एल्गोरिदम उपयोग किया जाता है?

उत्तर

11

के मूल PKCS # 5 (उर्फ PBKDF1) माइक्रोसॉफ्ट के कार्यान्वयन असुरक्षित एक्सटेंशन हैश समारोह की तुलना में अधिक बाइट्स कर सकते हैं प्रदान करते हैं (बग रिपोर्ट here और here देखें) प्रदान करने के लिए शामिल हैं।

यहां तक ​​कि अगर यह छोटी गाड़ी थी नहीं आप मानकों के गैर-दस्तावेजी, मालिकाना एक्सटेंशन से बचना चाहिए (या आप कभी नहीं भविष्य में अपने डेटा को डिक्रिप्ट करने में सक्षम हो सकता है -। कम से कम Windows बाहर नहीं)

मैं दृढ़ता से सुझाव है आप नए Rfc2898DeriveBytes का उपयोग करने के लिए जो PBKDF2 (PKCS # 5 v2) लागू करता है जो .NET 2.0 के बाद उपलब्ध है।

4

GetBytes विधि के पीछे क्या एल्गोरिदम उपयोग किया जाता है?

यह एल्गोरिदम पीबीकेडीएफ 1 का उपयोग करता है, जो मनमाने ढंग से कुंजी लंबाई की अनुमति देने के लिए थोड़ा संशोधित होता है। एक प्रतिस्थापन वर्ग, Rfc2898DeriveBytes पीबीकेडीएफ 2 का उपयोग करता है।

आप इस काम को अंतर्निहित अवधारणाओं के बारे में सामान्य विचार के लिए Wikipedia Article on PBKDF2 पढ़ सकते हैं।

+0

इस विधि को 20 बाइट्स से 32 बाइट कैसे प्राप्त हुए (जो 'SHA1' हैशिंग एल्गोरिदम उत्पन्न हुआ)। – Siddiqui

+0

@ सिद्दीकी @ 'हेनरिकहेल्स्ट्रॉम ने इसे अच्छी तरह से समझाया। – vcsjones

4

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

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

उदाहरण के लिए, यदि आप सीटीआर प्रक्रिया का उपयोग करते हैं, पीएचएफ के रूप में SHA-1, और छद्म यादृच्छिक आउटपुट के 32 बाइट चाहते हैं, तो आप SHA1 (keymaterial, 1) के पहले 12 बाइट्स के साथ SHA1 (keymaterial, 0) को जोड़ते हैं।

+0

आपके रीप्ले के लिए धन्यवाद, क्या आप मुझे सीटीआर प्रक्रिया के बारे में थोड़ा और स्पष्टीकरण दे सकते हैं। – Siddiqui

+1

इस मामले में, संख्या 0 और 1 को एक बिट द्वारा दर्शाया जा सकता है (याद रखें SHA-1 इनपुट के रूप में बिट्स के तारों पर चल रहा है), लेकिन आमतौर पर (keymaterial, 0) आदि को परिभाषित किया गया है। (ए) अंत में संलग्न एक बाइट (या शब्द) 0 के साथ कीमटेरियल, या (बी) कुंजी के साथ एक पूर्ण 64 बाइट इनपुट ब्लॉक, कुछ पैडिंग (आमतौर पर मूल्य शून्य के साथ बाइट्स), और एक 0 बाइट के साथ एक बाइट समाप्त। –