2011-08-17 15 views
8

मैं कुछ सी # -कोड को समझने की कोशिश कर रहा हूं, मुझे सौंपा गया है, जो क्रिप्टोग्राफी से संबंधित है, और विशेष रूप से System.Security.Cryptography से PasswordDeriveBytes का उपयोग करता है।.NET: PasswordDeriveBytes और Rfc2898DeriveBytes के बीच अंतर

.NET docs में, यह कहना है कि PasswordDeriveBytes का उपयोग करता है जो दस्तावेज़ के रूप में "PKCS # 5 v2.0 मानक" है, जो PBKDF2 (जहाँ तक मैं बता सकता है निर्दिष्ट में बाद में है "PBKDF1 एल्गोरिथ्म का एक विस्तार")। नेट पर कहीं भी मुझे मिला है (यहां स्टैक एक्सचेंज पर भी शामिल है), हालांकि, हर कोई कहता है "आरएफसी 28 9 8 डेरिवेट्स का उपयोग करें, क्योंकि पासवर्ड * को हटा दिया गया है और पीबीकेडीएफ 1 का उपयोग करता है"। लेकिन msdn.microsoft.com पर दस्तावेज़ों में एकमात्र अंतर यह प्रतीत होता है कि आरएफसी * -वर्जन विशेष रूप से पीबीकेडीएफ 2 का उल्लेख करता है, जहां पासवर्ड * "पीबीकेडीएफ 1 का विस्तार" और "पीकेसीएस # 5 वी 2.0" कहता है।

तो, क्या कोई मुझे बता सकता है कि दो वर्गों (यदि कोई है) के बीच अंतर क्या है और मुझे पीबीकेडीएफ 2 पासवर्ड कुंजी व्युत्पन्न के लिए दूसरे का उपयोग क्यों करना चाहिए?

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

उत्तर

0

PKCS#5 v2.0 दोनों PBKDF1 और PBKDF2, और भी सिफारिश की गई है कि आप नए अनुप्रयोगों के लिए PBKDF2 का उपयोग पश्च संगतता के कारणों के लिए पूर्व परिभाषित करता है। मुझे नहीं पता कि उत्तरार्द्ध पूर्व की तुलना में बेहतर क्यों है, लेकिन दो .NET कक्षाएं अलग-अलग लेकिन अंतःक्रियात्मक एल्गोरिदम का उपयोग करने लगती हैं। (। संभवतः क्योंकि केवल जिसके परिणामस्वरूप कुंजी का आदान-प्रदान किया जा रहा है, नहीं आदानों + KDF)

+0

तो, जैसा कि संदिग्ध है, सामान ज्यादातर मौके से काम करता है, और डिजाइन द्वारा इतना नहीं ... – adamski

+0

जरूरी नहीं है कि आप अभी भी आउटपुट डेटा और "अन्य कोड" द्वारा कौन सी एन्क्रिप्शन योजना/केडीएफ का उपयोग कर सकते हैं उल्लेख किया गया है कि एक कोड पथ है जिसे यह निर्धारित किया गया है कि एन्क्रिप्शन योजना पीबीकेडीएफ 2 का उपयोग करती है। वास्तव में "स्पष्ट रूप से पीबीकेडीएफ 2 का उपयोग करता है" से नहीं बता सकता है। – millimoose

1

यहाँ एक ब्लॉग पोस्ट मतभेद का ब्यौरा दिया गया है:

http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx

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

+0

हां, मैं 1 और 2 के बीच के अंतर के बारे में नहीं पूछ रहा था, लेकिन दो विशेष .NET कक्षाओं के बीच अंतर। :) – adamski

+0

जिसमें से एक 1 लागू करता है, जबकि अन्य लागू करता है 2 :) – orip

+1

तो "एक्सटेंशन" क्या हैं? – adamski

1

मुझे लगता है कि इस के लिए एक महान जवाब यहां पाया जा होगा:

C# PasswordDeriveBytes Confusion

लेकिन sumup रहे हैं:

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

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

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

1

आप PasswordDeriveBytes का दृष्टांत और एक मूल्य है जो अंतर्निहित को पचाने एल्गोरिथ्म के उत्पादन में आकार से छोटा है गुजर GetBytes विधि करने के लिए एक कॉल करते हैं तो आप वापस PBKDF1 एल्गोरिथ्म से एक मूल्य मिलता है।

यदि आप एक ही ऑब्जेक्ट के लिए गेटबाइट्स को दो कॉल करते हैं तो आपको कार्यान्वयन में गिनती बग का सामना करना पड़ सकता है।

पीबीकेडीएफ 1 केवल हैश एल्गोरिदम (उदाहरण के लिए SHA-1 के लिए 20 बाइट्स) के आकार तक आउटपुट करने के लिए वर्णित है, लेकिन पासवर्डडिएरबाइट क्लास ने हैश आउटपुट आकार के 1000 गुना तक समर्थन करने के लिए एक सूत्र बनाया है। इसलिए इस वर्ग द्वारा उत्पादित एक बड़ा मूल्य किसी अन्य प्लेटफार्म में आसानी से उपलब्ध नहीं हो सकता है।


आप Rfc2898DeriveBytes का दृष्टांत यदि आप PBKDF2 एल्गोरिथ्म के एक स्ट्रीमिंग का कार्यान्वयन मिलता है। पीबीकेडीएफ 1 पर पीबीकेडीएफ 2 का सबसे स्पष्ट अंतर यह है कि पीबीकेडीएफ 2 एक मनमानी डेटा की पीढ़ी की अनुमति देता है (सीमा (2^32-1)*hashOutputSize है, या SHA-1 85,899,345,900 बाइट्स के लिए)। आउटपुट मूल्य से इनपुट पासवर्ड को पुनर्प्राप्त करने के लिए पीबीकेडीएफ 2 एक जटिल परिसर (विशेष रूप से, एचएमएसी पर सीधे डाइजेस्ट) का भी उपयोग करता है।

कार्यान्वयन में "स्ट्रीमिंग" यह है कि GetBytes(5) और GetBytes(3) का संयोजन GetBytes(8) जैसा ही है। PasswordDeriveBytes के विपरीत, यह Rfc2898DeriveBytes में सही ढंग से काम करता है।


PBKDF1 मूल रूप से एक स्लाइड डेक पाया जाना चाहिए जो 1999 में, डेस कुंजी उत्पन्न करने के लिए बनाया गया था 1993 PBKDF2 में PKCS #5 v1.5 में प्रकाशित PKCS # 5 v2.0 में प्रकाशित हुआ था (जो RFC2898 के रूप में पुनर्प्रकाशित किया गया था) ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf पर (लेकिन ऐसा लगता है कि ftp://ftp.dfn-cert.de/pub/pca/docs/PKCS/ftp.rsa.com/99workshop/pkcs5_v2.0.ppt ऐसा करने के लिए हो सकता है) आगे मतभेदों को सारांशित करता है। (स्लाइड डेक आरएसए सुरक्षा, पीबीकेडीएफ 1 और पीबीकेडीएफ 2 के निर्माता द्वारा लिखे गए थे, और वे लोग हैं जो पीबीकेडीएफ 1 पर पीबीकेडीएफ 2 की सिफारिश करते हैं)।

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