2012-08-31 7 views
7

आप मुझे बता सकते है, तो निम्नलिखित एक अच्छा तरीका सुरक्षित रूप से एक पासवर्ड हैश करने के लिए एक डेटाबेस में संग्रहीत किया जा रहा है:क्या यह पासवर्ड हैश के लिए एक सुरक्षित तरीका है?

public string CreateStrongHash(string textToHash) { 

     byte[] salt =System.Text.Encoding.ASCII.GetBytes("TeStSaLt"); 

     Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(textToHash, salt, 1000); 
     var encryptor = SHA512.Create(); 
     var hash = encryptor.ComputeHash(k1.GetBytes(16)); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < hash.Length; i++) { 
      sb.Append(hash[i].ToString("x2")); 
     } 

     return sb.ToString(); 

    } 

पहले से कई धन्यवाद।

+4

आदर्श रूप से मुझे लगता है कि आपके पास प्रति उपयोगकर्ता एक अलग नमक होना चाहिए, और डेटाबेस में भी स्टोर करना चाहिए। – Bridge

+1

क्षमा करें अगर मैं थोड़ा घना हो रहा हूं, लेकिन अगर किसी को डेटाबेस तक पहुंच प्राप्त होती है, तो नमक को संग्रहित करने से किसी के लिए एन्क्रिप्शन को क्रैक करना आसान नहीं होता है? – ScubaSteve2012

+0

@ ScubaSteve2012 नमक पूर्व-गणना वाले हैश हमलों ("इंद्रधनुष तालिकाओं") को रोकता है। चूंकि पासवर्ड नमकीन होते हैं, इसलिए आपकी इंद्रधनुष तालिका मूल पासवर्ड को समझने में मदद करने में बेकार होगी। आपको इस हैश का उपयोग करके एक नई इंद्रधनुष तालिका बनाना होगा, जो कि बहुत अधिक क्रूर बल का हमला है। – Oleksi

उत्तर

7

आप पीबीकेडीएफ 2-एसएचए 1 का उपयोग करते हैं, जो सभ्य लेकिन महान नहीं है। Bcrypt थोड़ा बेहतर है, और स्क्रिप भी मजबूत है। लेकिन चूंकि .NET में पहले ही पीबीकेडीएफ 2 कार्यान्वयन में अंतर्निहित शामिल है, यह एक स्वीकार्य विकल्प है।

आपकी सबसे बड़ी गलती यह है कि आपको नमक का बिंदु नहीं मिला। प्रत्येक उपयोगकर्ता के लिए एक नमक अद्वितीय होना चाहिए। कम से कम 64 बिट्स का यादृच्छिक मूल्य बनाने के लिए यह मानक अभ्यास है। डेटाबेस में हैश के साथ इसे एक साथ स्टोर करें।

यदि आप चाहते हैं, तो आप नमक को दो हिस्सों में विभाजित कर सकते हैं। उपयोगकर्ता के साथ डेटाबेस में संग्रहीत एक, जो प्रत्येक के लिए अलग है, और एक साझा हिस्सा कहीं और संग्रहीत किया जाता है। यह दोनों के फायदे हासिल करता है।

मैं 1000 की तुलना में एक उच्च वर्कफ़ैक्टर का उपयोग करने की भी सिफारिश करता हूं। चित्रित करें कि कौन सा प्रदर्शन स्वीकार्य है, और तदनुसार समायोजित करें। मैं 10000 से नीचे नहीं जाऊंगा, और कुछ परिस्थितियों में (डिस्क एन्क्रिप्शन) एक लाख भी स्वीकार्य है।

+0

आपकी मदद के लिए धन्यवाद। – ScubaSteve2012

+0

यदि नमक मान संग्रहीत किया जाता है, जैसे डेटाबेस में, टक्कर खोजने से रोकने में बहुत कम मदद होती है। उस मामले में इसकी मुख्य उपयोगिता हमलावर को निरीक्षण द्वारा खोज रही है कि दो उपयोगकर्ताओं के पास एक ही पासवर्ड है। डेटा का उपयोग करना बेहतर होगा जिसे विशेष रूप से "नमक" के रूप में लेबल नहीं किया गया है, या इससे भी बेहतर, जो समान डेटा स्टोर में निहित नहीं है; हमलावर को न केवल नमक युक्त डेटाबेस से समझौता करना चाहिए, बल्कि कोडेबेस और/या एक अतिरिक्त डेटा स्टोर, यह निर्धारित करने के लिए कि नमक और कैसे उपयोग करें। – KeithS

+0

@ किथ्स मैंने टकराव शब्द का कभी भी उल्लेख नहीं किया, क्योंकि टकराव यहां अप्रासंगिक हैं। नमक का मुख्य बिंदु अद्वितीय होता है, और इस प्रकार बहु-लक्षित हमलों को रोकता है। अलग-अलग स्थानों में संग्रहीत एक रहस्य जोड़ना एक अच्छा अतिरिक्त है, लेकिन नमक का मुख्य बिंदु नहीं है। – CodesInChaos

5

इसे बेहतर किया जा सकता है। सबसे पहले, आपको इसके बजाय bcrypt का उपयोग करना चाहिए। एसएचए -512 जैसे पारंपरिक हैंश जीपीयू के साथ काफी आसानी से टूटा जा सकता है। समस्या यह है कि इन हैंश को गति के लिए डिज़ाइन किया गया है, और यह एक पासवर्ड हैश में आप जो चाहते हैं उसके विपरीत है। Bcrypt एक अनुकूली हैश एल्गोरिदम का एक उदाहरण है। इसे ब्रूट-फोर्सिंग diffiult बनाने के लिए "लंबा" समय लेने के लिए कॉन्फ़िगर किया जा सकता है (लेकिन फिर भी आपके सिस्टम में प्रदर्शन समस्याओं का कारण नहीं होगा)।

आप प्रत्येक उपयोगकर्ता के लिए लवण अद्वितीय बनाना चाहते हैं।

सुरक्षित रूप से हैश पासवर्ड कैसे सुरक्षित करें के बारे में अधिक जानकारी के लिए, this question देखें।

+3

वह पीबीकेडीएफ 2 का उपयोग कर रहा है, जो बीक्रिप्ट से थोड़ा बदतर है, लेकिन अभी भी अनुशंसित कार्यों में से एक है। – CodesInChaos

+0

SHA-512 सचमुच "सरकारी काम के लिए पर्याप्त है"; इसे क्रिप्टोग्राफिक रूप से मजबूत माना जाता है और समाधान खोजने की जटिलता को कम करने वाला कोई ज्ञात "शॉर्टकट" नहीं होता है। तथ्य यह है कि किसी भी समस्या को हल किया जा सकता है "पर्याप्त" इसे पर्याप्त हार्डवेयर फेंककर अप्रासंगिक है; आपको 5 कोशिश करनी होगी।किसी भी पहले से जेनरेट किए गए हैश के साथ टकराए जाने के लिए एक * अरब * मौका में 1 होने से पहले 2 × 10^72 मान। – KeithS

+1

@ किथ्स सादा SHA-512 को पासवर्ड हैशिंग जैसे अनुप्रयोगों के लिए पर्याप्त नहीं माना जाता है, क्योंकि यह बहुत तेज़ है। पासवर्ड में हैशिंग में आप पासवर्ड में एन्ट्रॉपी की कमी की क्षतिपूर्ति के लिए जानबूझकर महंगे कार्यों का उपयोग करते हैं। | दूसरी तरफ SHA-512 के साथ पीबीकेएफडीएफ 2 सभ्य है। – CodesInChaos