क्या BCrypt C # में उपयोग करने के लिए एक अच्छा हैशिंग एल्गोरिथ्म है? मैं इसे कहाँ पा सकता हूँ? [बन्द है]


129

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

मैं C # में प्रोग्रामिंग कर रहा हूं और सोच रहा हूं कि क्या किसी को बीसीक्रिप्ट के लिए अच्छे कार्यान्वयन का पता है? मुझे यह पृष्ठ मिला , लेकिन मुझे नहीं पता कि यह फर्जी है या नहीं।

पासवर्ड हैशिंग योजना चुनते समय मुझे क्या पता होना चाहिए? क्या बीसीक्रिप्ट एक 'अच्छा' कार्यान्वयन है?

जवाबों:


148

सबसे पहले, कुछ शब्द जो महत्वपूर्ण हैं:

हैशिंग - एक स्ट्रिंग लेने और पात्रों के अनुक्रम का निर्माण करने का कार्य जो मूल स्ट्रिंग में वापस नहीं लाया जा सकता है।

सममित एन्क्रिप्शन - (आमतौर पर केवल 'एन्क्रिप्शन' के रूप में जाना जाता है) - एक स्ट्रिंग लेने और पात्रों के अनुक्रम का निर्माण करने के लिए जिसे उसी एन्क्रिप्शन कुंजी के उपयोग के माध्यम से मूल स्ट्रिंग में डिक्रिप्ट किया जा सकता है जिसने इसे एन्क्रिप्ट किया था।

रेनबो टेबल - एक लुकअप टेबल जिसमें एक विशिष्ट हैशिंग एल्गोरिथ्म में हैशेड के सभी प्रकार होते हैं।

नमक - एक ज्ञात यादृच्छिक स्ट्रिंग हैशेड से पहले मूल स्ट्रिंग में जोड़ा जाता है।

.NET फ्रेमवर्क के लिए, Bcrypt के पास अभी तक एक सत्यापित संदर्भ कार्यान्वयन नहीं है। यह महत्वपूर्ण है क्योंकि यह जानने का कोई तरीका नहीं है कि मौजूदा कार्यान्वयन में गंभीर खामियां हैं या नहीं। आप यहां .NET के लिए BCrypt का कार्यान्वयन प्राप्त कर सकते हैं । मुझे क्रिप्टोग्राफी के बारे में यह जानने के लिए पर्याप्त नहीं है कि यह एक अच्छा या बुरा कार्यान्वयन है। क्रिप्टोग्राफी एक बहुत गहरा क्षेत्र है। अपने स्वयं के एन्क्रिप्शन एल्गोरिथ्म के निर्माण का प्रयास न करें । गंभीरता से।

यदि आप अपनी स्वयं की पासवर्ड सुरक्षा (आह) को लागू करने जा रहे हैं, तो आपको कई काम करने होंगे:

  1. अपेक्षाकृत सुरक्षित हैश एल्गोरिथ्म का उपयोग करें ।
  2. हैशेड से पहले प्रत्येक पासवर्ड को नमक करें।
  3. प्रत्येक पासवर्ड के लिए एक अद्वितीय और लंबे नमक का उपयोग करें , और पासवर्ड के साथ नमक को स्टोर करें।
  4. मजबूत पासवर्ड की आवश्यकता है

दुर्भाग्य से, यदि आप यह सब करते हैं, तो भी एक निर्धारित हैकर अभी भी संभावित रूप से पासवर्ड का पता लगा सकता है, तो यह उसे वास्तव में लंबे समय तक ले जाएगा। वह आपका मुख्य शत्रु है: समय

Bcrypt एल्गोरिथ्म काम करता है क्योंकि यह लेता है पाँच आदेश परिमाण के लंबे समय तक हैश को MD5 की तुलना में एक पासवर्ड ; (और अभी भी एईएस या SHA-512 की तुलना में अधिक)। यह हैकर को आपके पासवर्ड को देखने के लिए इंद्रधनुष तालिका बनाने के लिए बहुत अधिक समय बिताने के लिए मजबूर करता है, जिससे यह संभावना कम हो जाती है कि आपका पासवर्ड हैक होने के खतरे में होगा।

यदि आप अपने पासवर्ड को नमस्कार कर रहे हैं, और प्रत्येक नमक अलग है, तो एक संभावित हैकर को नमक के प्रत्येक भिन्नता के लिए एक इंद्रधनुष तालिका बनानी होगी , बस एक नमकीन + हैशेड पासवर्ड के लिए एक इंद्रधनुष तालिका होनी चाहिए। इसका मतलब है कि यदि आपके 1 मिलियन उपयोगकर्ता हैं, तो एक हैकर को 1 मिलियन इंद्रधनुष सारणी तैयार करनी होगी। यदि आप प्रत्येक उपयोगकर्ता के लिए समान नमक का उपयोग कर रहे हैं, तो हैकर को आपके सिस्टम को सफलतापूर्वक हैक करने के लिए केवल 1 इंद्रधनुष तालिका उत्पन्न करनी होगी।

यदि आप अपने पासवर्ड को सलामी नहीं दे रहे हैं, तो सभी हमलावरों को वहाँ (एईएस, एसएचए -51, एमडी 5) को लागू करने के लिए एक मौजूदा इंद्रधनुष तालिका को खींचना होगा और यह देखना होगा कि क्या कोई हैश से मेल खाता है। यह पहले से ही किया गया है , एक हमलावर को इन इंद्रधनुष तालिकाओं की गणना करने की आवश्यकता नहीं है

इन सबके साथ भी, आपको अच्छी सुरक्षा प्रथाओं का उपयोग करना चाहिए । यदि वे सफलतापूर्वक आपकी साइट पर एक और हमला वेक्टर (एक्सएसएस, एसक्यूएल इंजेक्शन, सीएसआरएफ, एट अल। ) का उपयोग कर सकते हैं, तो पासवर्ड की अच्छी सुरक्षा सुनिश्चित करें। यह एक विवादास्पद बयान की तरह लगता है, लेकिन इसके बारे में सोचें: यदि मैं आपकी सभी उपयोगकर्ता जानकारी SQL इंजेक्शन हमले के माध्यम से प्राप्त कर सकता हूं, या मैं आपके उपयोगकर्ताओं को XSS के माध्यम से अपनी कुकीज़ देने के लिए प्राप्त कर सकता हूं, तो इससे कोई फर्क नहीं पड़ता कि आपका पासवर्ड कितना अच्छा है सुरक्षा है

अन्य संसाधन:

  1. जेफ एटवुड: .NET एन्क्रिप्शन सरलीकृत (हैशिंग के अवलोकन के लिए महान)
  2. जेफ एटवुड: मैंने अभी आपके रूप में लॉग इन किया है
  3. जेफ एटवुड: आप शायद गलत तरीके से पासवर्ड स्टोर कर रहे हैं
  4. जेफ एटवुड: स्पीड हैशिंग

नोट: कृपया अन्य अच्छे संसाधनों की सिफारिश करें। मैंने दर्जनों लेखकों द्वारा एक दर्जन लेख पढ़े होंगे, लेकिन कुछ इस विषय पर स्पष्ट रूप से लिखते हैं जैसा कि जेफ करता है। कृपया लेखों में संपादित करें क्योंकि आप उन्हें ढूंढते हैं।


शायद अपने नमक पैराग्राफ में जोड़ें कि नमक को बेतरतीब ढंग से चुना जाना चाहिए
जैको

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

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

7
मैं आपके कथन के साथ समस्या लूंगा "यदि वे सफलतापूर्वक XSS या SQL इंजेक्शन का उपयोग कर सकते हैं, तो अच्छा पासवर्ड सुरक्षा कोई मायने नहीं रखता है।" इसके विपरीत, यदि वे आपकी साइट पर सफलतापूर्वक XSS या SQL इंजेक्षन कर सकते हैं, तो अच्छी पासवर्ड सुरक्षा और भी महत्वपूर्ण है। यहां कुंजी "रक्षा में गहराई" है - आपको सुरक्षा को कसना चाहिए जहां तक ​​आपके आवेदन की प्रत्येक परत पर व्यावहारिक है।
jammycakes

2
@jammycakes बिल्कुल; मेरी बात खो गई: आप बस यह नहीं कह सकते, 'अरे, हम हैश और हमारे पासवर्ड को नमक करते हैं, "हम ठीक हैं"!'
जॉर्ज स्टॉकर

74

आपको .NET में BCrypt का उपयोग नहीं करना चाहिए । आपको PBKDF2 का उपयोग करना चाहिए जैसा कि .NET .NET कार्यान्वयन में बनाया गया है। यह केवल स्वतंत्र रूप से उपलब्ध क्रिप्टोग्राफिक रूप से सत्यापित कार्यान्वयन है। साथ ही एनआईएसटी द्वारा अनुशंसित एल्गोरिथम होने के साथ ।

StackId ने पहले BCrypt का उपयोग किया और इस कारण से PBKDF2 में चला गया:

उन उत्सुक लोगों के लिए, हम PBKDF2 के साथ हैशिंग पासवर्ड हैं। अप्रत्यक्षता की कुछ परतों के माध्यम से रिलेवेंट कोड यहाँ ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ) है। पहले की पुनरावृत्ति में, हम BCrypt का उपयोग कर रहे थे; लेकिन पीबीकेडीएफ 2 में ले जाया गया क्योंकि यह .NET फ्रेमवर्क में बनाया गया है, जबकि बीसीक्रिप्ट हमें एक कार्यान्वयन (कोई छोटा उपक्रम) सत्यापित करने की आवश्यकता नहीं होगी।

केविन मॉन्ट्रोस, 27 मई 2011

(GitHub पर अपडेट किया गया लिंक)

संपादित करें: क्रिप्टोग्राफिक शब्दों में सत्यापित का अर्थ आसानी से समझ में नहीं आता है, एक सत्यापित कार्यान्वयन का मतलब है कि यह क्रिप्टोग्राफिक रूप से त्रुटि के बिना लागू किया गया है। इस की लागत आसानी से $ 20,000 या अधिक तक पहुंच सकती है। मुझे यह याद है कि जब मैं ओपनएसएसएल पर शोध कर रहा था और पढ़ा कि उन्होंने कहा कि उन्होंने पूरी सत्यापन प्रक्रिया पूरी नहीं की है, लेकिन अगर आपको पूरी तरह से सत्यापित करने की आवश्यकता है कि वे आपको इसके लिए सही रास्ता बता सकते हैं और संबंधित लागतों का उल्लेख कर सकते हैं। कुछ सरकारी आवश्यकताओं में सत्यापित एन्क्रिप्शन एल्गोरिदम के लिए जनादेश शामिल हैं।

.NET में bcrypt कार्यान्वयन को सत्यापित नहीं किया गया है। असत्यापित एन्क्रिप्शन कार्यान्वयन का उपयोग करके आप पूरी तरह से निश्चित नहीं हो सकते हैं कि इसमें जानबूझकर दुर्भावनापूर्ण दोष नहीं हैं जैसे कि पिछले दरवाजे को एन्क्रिप्टेड या अनजाने में कार्यान्वयन दोषों की अनुमति देना जो क्रिप्टोग्राफिक रूप से असुरक्षित डेटा का परिणाम है।

२०१४ संपादित करें: किसी ऐसे व्यक्ति के लिए जिसने सत्यापित क्रिप्टोप्रोग्राफिकल एल्गोरिदम का उपयोग करने की अनिवार्यता पर सवाल उठाया था, जो ओपनएसएसएल में शोषण किए गए हार्दिक हैक द्वारा बर्बाद की गई तबाही को देखता है । यह एक असत्यापित कार्यान्वयन का उपयोग करने की लागत है। यह सुरक्षित है .... जब तक आपको पता चलता है कि कोई भी व्यक्ति आपके सर्वर की संपूर्ण मेमोरी सामग्री को पढ़ सकता है।

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

यह एक असत्यापित कार्यान्वयन की परिभाषा है। यहां तक ​​कि सबसे छोटी खराबी पूरे सुरक्षा को अपंग कर सकती है।

2015 का संपादन: अनुशंसित भाषा को हटा दिया गया और इसे निरपेक्षता से बदल दिया गया। पोस्टर के लिए एंबेडेड मूल केविन मॉन्ट्रोस टिप्पणी।


25
लिंक्ड कमेंट को कोट करने के लिए: "[हम] पीबीकेडीएफ 2 में चले गए क्योंकि यह .NET फ्रेमवर्क में बनाया गया है, जबकि बीसीक्रिप्ट हमें एक कार्यान्वयन को सत्यापित करने की आवश्यकता होगी"। ध्यान दें कि टिप्पणी यह ​​नहीं कहती है कि एल्गोरिथ्म बेहतर है, बस यह है कि एसई देव टीम अंतर्निहित पीबीकेडीएफ 2 कार्यान्वयन को एक बाहरी पुस्तकालय (जो अंततः, एक निर्णय कॉल) की तुलना में अधिक विश्वसनीय मानती है ।
पिस्कोर ने

3
@ उत्तर मैंने अपना उत्तर अपडेट कर दिया है। यह इस बारे में नहीं है कि एसओ टीम क्या सुरक्षित मानती है, लेकिन स्वाभाविक रूप से सिद्ध सुरक्षित या उम्मीद के बीच एक निर्णय कॉल सुरक्षित है। बाद में जब यह क्रिप्टोग्राफी की बात आती है तो अस्वीकार्य है।
क्रिस मैरिसिक

6
मुझे आश्चर्य है कि एसओ ने नए हैश के लिए सभी bcrypt हैशेड पासवर्डों को कैसे स्थानांतरित किया? क्या उन्हें नए एल्गोरिथ्म का उपयोग करके हैश करने के लिए कच्चे पासवर्ड की आवश्यकता होगी?
धर्मेंद्र कुमार 'डीके'

8
@DK मुझे नहीं लगता कि आपको उनसे अपने पासवर्ड रीसेट करने के लिए कहना होगा। अगले लॉग इन (जहां वे अपने प्लेनटेक्स्ट पासवर्ड की आपूर्ति करते हैं) पर आप ऐसा कर सकते हैं जो मुझे विश्वास है।
मैट कोकाज

12
यह खराब सलाह है और मुझे आश्चर्य है कि इसमें इतने उतार-चढ़ाव हैं। एक प्रबंधित भाषा में बीसीक्रिप्ट कार्यान्वयन को सत्यापित करना बहुत अधिक तुच्छ है, सी में एक संपूर्ण एसएसएल कार्यान्वयन की तरह कुछ सत्यापित करने की तुलना में। हार्टलेड पूरी तरह अप्रासंगिक है; आप हैश समानता जाँच के साथ PHP प्रकार coercing समस्याओं की तरह कुछ का उल्लेख करना बेहतर होगा। प्लस एक व्यावहारिक अर्थ में काफी हद तक उपयुक्त है, पीबीकेडीएफ 2 एक केडीएफ है, न कि पासवर्ड हैशिंग एल्गोरिथ्म, जबकि बीसीक्रिप्ट बेहतर अनुकूल है। भले ही, यह इन दिनों वैसे भी आर्गन 2 का उपयोग करने के लिए बहुत अधिक समझ में आता है, जिसके लिए एक अच्छी तरह से परीक्षण किया गया सी # लाइब्रेरी है
पोलीनोमियल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.