2009-08-31 10 views
17

मैं ऐसे TripleDes, डेस, आदिPasswordDeriveBytes बनाम Rfc2898DeriveBytes, अप्रचलित लेकिन जिस तरह से तेजी से

मूल रूप से दो विकल्प संगत कुंजी और चतुर्थ के लिए उत्पन्न करने के लिए कर रहे हैं के रूप में SymmetricAlgorithm से विरासत में मिली वर्गों के आधार पर एक एन्क्रिप्शन कार्यक्षमता पर काम कर रहा हूँ मेरी एल्गोरिदम कक्षा, PasswordDeriveBytes और Rfc2898DeriveBytes, दोनों DeriveBytes अमूर्त वर्ग से प्राप्त होते हैं।

PasswordDeriveBytes.GetBytes() विधि नेट ढांचे में के रूप में अप्रचलित चिह्नित है, जबकि Rfc2898DeriveBytes.GetBytes() की सिफारिश की है, के रूप में यह PBKDF2 मानक मेल खाता है। लेकिन, मेरा परीक्षण पर आधारित, बुला Rfc2898DeriveBytes कक्षा में एक ही GetBytes() विधि लगभग 15 गुना है कि PasswordDeriveBytes वर्ग है, जो अप्रत्याशित CPU उपयोग (हमेशा से अधिक 50%) की ओर जाता है की तुलना में धीमी है।

Here're कुछ परीक्षण डेटा:

  • पुनरावृत्ति: 100
  • एल्गोरिथ्म के प्रकार: डेस
  • मूल पाठ: "मैं एक परीक्षण कुंजी हूँ, मुझे एन्क्रिप्ट कृपया"
  • समय:
    • PasswordDeriveBytes: 99ms
    • Rfc2898DeriveBytes: 1,373ms

परीक्षण के आधार पर, Rfc2898DeriveBytes के खराब प्रदर्शन उत्पादन वातावरण में स्वीकार्य नहीं है।

किसी को भी करने से पहले इस समस्या को देखा है? कोई समाधान मैं अभी भी प्रदर्शन को मारने के बिना एक मानक एक का उपयोग कर सकते हैं? एक अप्रचलित विधि का उपयोग करने के लिए कोई जोखिम (भविष्य के संस्करण में हटाया जा सकता है)?

धन्यवाद दोस्तों!

संपादित करें:

शायद मैंने पाया जहां समस्या है ... PasswordDeriveBytes के लिए डिफ़ॉल्ट पुनरावृत्ति संख्या संख्या 100 है, जबकि Rfc2898DeriveBytes के लिए 1000 के बाद मैं 1000 में एक ही नंबर के लिए उन्हें बदल गया है, को क्रियान्वित Rfc2898DeriveBytes केवल दो बार है।

+0

आप उत्पादन वातावरण में कितनी बार चाबियाँ प्राप्त करने जा रहे हैं? और, आपके समय के डेटा के बारे में, जब आपने "100 पुनरावृत्तियों" कहा - क्या यह एक कुंजी पर पुनरावृत्तियों है, या आपने 100 कुंजी उत्पन्न की हैं। 100 परीक्षणों के आधार पर कोई भी पेफ डेटा संदिग्ध है, लेकिन मुझे लगता है कि आपने वास्तव में एक परीक्षण का परीक्षण किया है। सभी perf विश्लेषण मामलों में, एक परीक्षण के प्रतिक्रिया समय के आधार पर सर्वर प्रदर्शन के बारे में निष्कर्ष निकालने के लिए उचित नहीं है। – Cheeso

+0

@ चेसियो परीक्षण इन दो वर्गों के प्रदर्शन के सिर्फ एक यूनिट परीक्षण था और यह वास्तविक ऐप में नहीं किया गया था। मैंने उल्लेख किया कि "100 पुनरावृत्तियों" थोड़ा उलझन में था, जिसका मतलब है कि मैंने उनमें से प्रत्येक को 100 बार निष्पादित किया था। यह वास्तविक पर्फ परीक्षण नहीं है बल्कि सिर्फ एक तुलना है। – tshao

+5

मुझे लगता है कि आपने बिंदु 'आरएफसी 28 9 8 डीरिवेट्स' को याद किया होगा, धीमे होने के लिए मूल रूप से _ डिज़ाइन किया गया है ताकि पासवर्ड हैश चेक (लॉग-ऑन किया गया हो और इसलिए काफी बार-बार) ब्रूट फोर्स हमलों के दौरान प्रदर्शन हिट पर ध्यान न दें। यदि आपको हैश के लोड उत्पन्न करने की आवश्यकता है 'आरएफसी 28 9 8 डेरिवेट्स' आपके लिए नहीं है, लेकिन अगर आपको ब्रूट फोर्स हमलों से कुछ सुरक्षा की आवश्यकता है तो यह है। – Keith

उत्तर

25

वे एक ही बात नहीं कर रहे हैं।

आरएफसी 28 9 8DeriveBytes पीबीकेडीएफ 2 का कार्यान्वयन है। पासवर्ड डेरिवबाइट्स पीबीकेडीएफ 1 का कार्यान्वयन है। पीबीकेडीएफ 2 एक अलग विधि का उपयोग करके एक अलग आउटपुट उत्पन्न करता है, और पीबीकेडीएफ 1 की तुलना में राउंड की एक बड़ी संख्या उत्पन्न करता है।

पासवर्ड हैशिंग फ़ंक्शन, जैसे कि, मुख्य व्युत्पन्न के लिए उपयोग किए जाने वाले धीमे होने चाहिए। यही बात है - यह उन्हें क्रैक करने के लिए और अधिक कठिन बनाता है।

दो कार्य संगत नहीं हैं, और PasswordDeriveBytes लगभग सुरक्षित नहीं है।

+0

धन्यवाद ब्लैकअरा। मैं समझ सकता हूं कि पीबीकेडीएफ 2 कार्यान्वयन धीमा होना चाहिए, लेकिन आरएफसी 2 9 8 9 डीरिवबाइट्स क्लास का उपयोग करने के लिए कोई सर्वोत्तम अभ्यास नहीं है, जैसे कि उसी कुंजी/चतुर्थ को कैश/पुन: उपयोग कैसे करें? उत्पादन वातावरण में जितनी धीमी गति से एक विधि चलाना स्वीकार्य नहीं है। : पी – tshao

+4

आम तौर पर, आप केवल पासवर्ड से कुंजी उत्पन्न करने के लिए इन फ़ंक्शंस का उपयोग करना चाहते हैं। आम तौर पर पासवर्ड-सुरक्षित संग्रह, या इसी तरह के कुछ के लिए। किसी संग्रह को एन्क्रिप्ट करने के लिए, आप एक यादृच्छिक चतुर्थ उत्पन्न करेंगे, और पासवर्ड और IV से एक कुंजी उत्पन्न करेंगे। आप चतुर्थ (लेकिन कुंजी कभी नहीं) स्टोर करते हैं। तब आप संग्रह में प्रत्येक फ़ाइल के लिए कुंजी का फिर से उपयोग कर सकते हैं, जब तक कि प्रत्येक फ़ाइल को एक अलग चतुर्थ (संग्रह में संग्रहीत) के साथ एन्क्रिप्ट किया जाता है। इन कार्यों के लिए एकमात्र अन्य उपयोग पासवर्ड हैशिंग है। आप इसे एक बार करेंगे, जब कोई उपयोगकर्ता लॉग इन करता है। किसी भी अन्य उपयोग के लिए, शायद एक बेहतर तरीका है। – BlackAura

9

मुझे लगता है कि आप derivebytes की बात को अनदेखा कर रहे हैं। यह धीमा होना चाहिए। यह जानबूझकर धीमी एल्गोरिदम का उपयोग करता है जिसे चतुर चाल से नहीं बढ़ाया जा सकता है।सामान्य "पुनरावृत्तियों की संख्या" पैरामीटर 2^16-2^20 रेंज में होना चाहिए और उपयोगकर्ता दर्ज पासवर्ड के बीच 0.1-0.5 दूसरी देरी पेश करना चाहिए और कुंजी जेनरेट की गई है। इसका उद्देश्य "आलसी अज्ञानी उपयोगकर्ताओं" द्वारा चुने गए कमजोर पासवर्ड के खिलाफ बचाव करना और ब्रूट फोर्स सर्च को धीमा करना है।

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