security सर्वोत्तम व्यवहार: सलाखों और काली मिर्च पासवर्ड?




hash passwords (4)

ठीक। यह देखते हुए कि मुझे इस बारे में लिखने की ज़रूरत है, मैं अकेले मिर्च पर एक आखिरी कैनोलिक जवाब दूंगा।

मिर्च के स्पष्ट ऊपर

ऐसा लगता है कि मिर्च को हैश कार्यों को और अधिक सुरक्षित बनाना चाहिए। मेरा मतलब है, अगर हमलावर केवल आपका डेटाबेस प्राप्त करता है, तो आपके उपयोगकर्ता पासवर्ड सुरक्षित होना चाहिए, है ना? तार्किक लगता है, है ना?

यही कारण है कि बहुत से लोग मानते हैं कि मिर्च एक अच्छा विचार है। यह समझ में आता है"।

मिर्च की वास्तविकता

सुरक्षा और क्रिप्टोग्राफी क्षेत्रों में, "समझ में आता है" पर्याप्त नहीं है। इसे साबित करने के लिए कुछ साबित होना चाहिए और इसे समझने के लिए समझदारी होनी चाहिए। इसके अतिरिक्त, इसे एक सतत तरीके से कार्यान्वित किया जाना चाहिए। सबसे सुरक्षित प्रणाली जिसे बनाए रखा नहीं जा सकता है उसे असुरक्षित माना जाता है (क्योंकि यदि उस सुरक्षा का कोई भी हिस्सा टूट जाता है, तो पूरी प्रणाली अलग हो जाती है)।

और मिर्च न तो साबित या रखरखाव मॉडल फिट ...

मिर्च के साथ सैद्धांतिक समस्याएं

अब जब हमने मंच निर्धारित किया है, चलो देखते हैं कि मिर्च के साथ क्या गलत है।

  • एक हैश को दूसरे में खिलाना खतरनाक हो सकता है।

    आपके उदाहरण में, आप hash_function($salt . hash_function($pepper . $password))

    हम पिछले अनुभव से जानते हैं कि एक हैश फ़ंक्शन में "हैश फ़िशिंग" एक और हैश फ़ंक्शन समग्र सुरक्षा को कम कर सकता है। कारण यह है कि दोनों हैश फ़ंक्शन हमले का लक्ष्य बन सकते हैं।

    यही कारण है कि पीबीकेडीएफ PBKDF2 जैसे एल्गोरिदम उन्हें गठबंधन करने के लिए विशेष संचालन का उपयोग करते हैं (उस मामले में एचएमएसी)।

    मुद्दा यह है कि यह एक बड़ा सौदा नहीं है, यह सिर्फ चारों ओर फेंकने के लिए एक छोटी सी बात नहीं है। क्रिप्टो सिस्टम को "काम करना चाहिए" मामलों से बचने के लिए डिज़ाइन किया गया है, और इसके बजाय "काम करने के लिए डिज़ाइन किए गए" मामलों पर ध्यान केंद्रित किया गया है।

    हालांकि यह पूरी तरह से सैद्धांतिक प्रतीत हो सकता है, यह वास्तव में नहीं है। उदाहरण के लिए, Bcrypt मनमाने ढंग से पासवर्ड स्वीकार नहीं कर सकता है । तो bcrypt(hash(pw), salt) गुजरने से वास्तव में bcrypt(pw, salt) तुलना में बहुत कमजोर हैश हो bcrypt(pw, salt) यदि hash() एक द्विआधारी स्ट्रिंग देता है।

  • डिजाइन के खिलाफ काम करना

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

    वर्तमान पासवर्ड हैशिंग एल्गोरिदम (bcrypt, pbkdf2, आदि) सभी को केवल एक गुप्त मान (पासवर्ड) में लेने के लिए डिज़ाइन किया गया है। एल्गोरिदम में एक और रहस्य में जोड़ने का अध्ययन नहीं किया गया है।

    इसका मतलब यह नहीं है कि यह सुरक्षित नहीं है। इसका मतलब है कि हम नहीं जानते कि यह सुरक्षित है या नहीं। और सुरक्षा और क्रिप्टोग्राफी के साथ सामान्य सिफारिश यह है कि अगर हम नहीं जानते हैं, तो यह नहीं है।

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

  • जटिलता सुरक्षा की दुश्मन है

    विश्वास करो या नहीं, जटिलता सुरक्षा की दुश्मन है । जटिल दिखने वाला एल्गोरिदम बनाना सुरक्षित हो सकता है, या ऐसा नहीं हो सकता है। लेकिन संभावनाएं काफी महत्वपूर्ण हैं कि यह सुरक्षित नहीं है।

मिर्च के साथ महत्वपूर्ण समस्याएं

  • यह रखरखाव योग्य नहीं है

    मिर्च के आपके कार्यान्वयन में काली मिर्च कुंजी घुमाने की क्षमता को रोक दिया जाता है। चूंकि मिर्च का उपयोग एक ही तरीके से इनपुट में किया जाता है, इसलिए आप मूल्य के जीवनकाल के लिए कभी भी मिर्च नहीं बदल सकते हैं। इसका मतलब यह है कि आपको महत्वपूर्ण रोटेशन का समर्थन करने के लिए कुछ भयानक हैक्स के साथ आने की आवश्यकता होगी।

    यह बेहद जरूरी है क्योंकि जब भी आप क्रिप्टोग्राफिक रहस्यों को स्टोर करते हैं तो इसकी आवश्यकता होती है। चाबियाँ घुमाने के लिए तंत्र नहीं है (समय-समय पर, और उल्लंघन के बाद) एक बड़ी सुरक्षा भेद्यता है।

    और आपके वर्तमान मिर्च दृष्टिकोण के लिए प्रत्येक उपयोगकर्ता को या तो रोटेशन द्वारा अपना पासवर्ड पूरी तरह से अमान्य करने की आवश्यकता होगी, या घुमाए जाने के लिए उनके अगले लॉगिन तक प्रतीक्षा करें (जो कभी नहीं हो सकता है) ...

    जो मूल रूप से आपके दृष्टिकोण को तुरंत नहीं जाता है।

  • यह आपको अपनी खुद की क्रिप्टो रोल करने की आवश्यकता है

    चूंकि कोई वर्तमान एल्गोरिदम मिर्च की अवधारणा का समर्थन नहीं करता है, इसलिए आपको एक मिर्च का समर्थन करने के लिए या तो एल्गोरिदम लिखना या नए आविष्कार करना आवश्यक है। और यदि आप तुरंत नहीं देख सकते हैं कि यह वास्तव में एक बुरी चीज क्यों है:

    किसी भी, सबसे अनजान शौकिया से सर्वश्रेष्ठ क्रिप्टोग्राफर तक, एक एल्गोरिदम बना सकता है कि वह खुद तोड़ नहीं सकता है।

    अपने खुद के क्रिप्टो रोल कभी नहीं ...

बेहतर तरीका

इसलिए, ऊपर वर्णित सभी समस्याओं में से, स्थिति को संभालने के दो तरीके हैं।

  • जैसे ही वे मौजूद हैं, एल्गोरिदम का प्रयोग करें

    यदि आप bcrypt या सही ढंग से स्क्रिप करते हैं (एक उच्च लागत के साथ), तो सबसे कमजोर शब्दकोश पासवर्ड सभी को सांख्यिकीय रूप से सुरक्षित होना चाहिए। लागत 5 पर हैशिंग बीक्रिप्ट के लिए वर्तमान रिकॉर्ड 71k हैश प्रति सेकेंड है। उस दर पर भी 6 वर्ण यादृच्छिक पासवर्ड को क्रैक करने में सालों लगेंगे। और मेरी न्यूनतम अनुशंसित लागत पर विचार करना 10 है, जो 32 के कारक द्वारा प्रति सेकंड हैश को कम करता है। इसलिए हम प्रति सेकंड केवल 2200 हैंश से बात करेंगे। उस दर पर, यहां तक ​​कि कुछ शब्दकोश वाक्यांश या modificaitons भी सुरक्षित हो सकता है।

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

  • संग्रहण से पहले आउटपुट हैश एन्क्रिप्ट करें

    सुरक्षा क्षेत्र में मौजूद एक एल्गोरिदम है जो हमने ऊपर जो कुछ भी कहा है उसे संभालने के लिए डिज़ाइन किया गया है। यह एक ब्लॉक सिफर है। यह अच्छा है, क्योंकि यह उलटा है, इसलिए हम चाबियाँ घुमा सकते हैं (याय! रखरखाव!)। यह अच्छा है क्योंकि इसे डिज़ाइन के रूप में उपयोग किया जा रहा है। यह अच्छा है क्योंकि यह उपयोगकर्ता को कोई जानकारी नहीं देता है।

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

टीएल / डॉ

मिर्च का प्रयोग न करें। उनके साथ कई समस्याएं हैं, और दो बेहतर तरीके हैं: किसी भी सर्वर-साइड गुप्त (हाँ, यह ठीक है) का उपयोग नहीं करना और भंडारण से पहले ब्लॉक सिफर का उपयोग करके आउटपुट हैश को एन्क्रिप्ट करना।

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

hash_function($salt.hash_function($pepper.$password)) [multiple iterations]

चुने हुए हैश एल्गोरिदम को अनदेखा करना (मैं चाहता हूं कि यह लवण और मिर्च की चर्चा हो और विशिष्ट एल्गोरिदम नहीं, लेकिन मैं एक सुरक्षित उपयोग कर रहा हूं), क्या यह एक सुरक्षित विकल्प है या मुझे कुछ अलग करना चाहिए? उन शर्तों के लिए अपरिचित लोगों के लिए:

  • नमक एक यादृच्छिक रूप से जेनरेट किया गया मान आमतौर पर डेटाबेस में स्ट्रिंग के साथ संग्रहीत होता है ताकि पासवर्ड को क्रैक करने के लिए हैश टेबल का उपयोग करना असंभव हो सके। चूंकि प्रत्येक पासवर्ड का अपना नमक होता है, इसलिए उन्हें क्रैक करने के लिए सभी को क्रूर-मजबूर होना चाहिए; हालांकि, चूंकि डेटाबेस में नमक को पासवर्ड हैश के साथ संग्रहीत किया जाता है, इसलिए डेटाबेस समझौता दोनों का मतलब है।

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

क्या कोई ऐसी चीज है जो मुझे याद आ रही है और मेरे पासवर्ड की सुरक्षा और सुरक्षा के लिए मेरे पासवर्ड को सबसे अच्छा विकल्प है? क्या इस तरह से ऐसा करने के लिए कोई संभावित सुरक्षा दोष है?

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


किसी भी सुरक्षा प्रासंगिकता के रूप में आपके स्रोत कोड में हार्डकोडेड मान को संग्रहीत नहीं देख सकता। यह अस्पष्टता के माध्यम से सुरक्षा है।

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


मुट्ठी हमें एक काली मिर्च के सही लाभ के बारे में बात करनी चाहिए:

  • काली मिर्च एक विशेष हमले में एक शब्दकोश हमले से कमजोर पासवर्ड की रक्षा कर सकती है, जहां हमलावर के पास डेटाबेस (हैश युक्त) तक पहुंच-पहुंच है लेकिन मिर्च के साथ स्रोत कोड तक पहुंच नहीं है।

एक सामान्य परिदृश्य एसक्यूएल-इंजेक्शन होगा, बैकअप को हटा दिया जाएगा, सर्वर को त्याग दिया जाएगा ... ये स्थितियां असामान्य नहीं हैं जितनी यह लगता है, और अक्सर आपके नियंत्रण में नहीं (सर्वर-होस्टिंग)। यदि तुम प्रयोग करते हो...

  • प्रति पासवर्ड एक अद्वितीय नमक
  • बीसीआरपीटी की तरह एक धीमी हैशिंग एल्गोरिदम

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

दूसरा सवाल यह है कि मिर्च को कैसे लागू किया जाए ?

एक काली मिर्च लगाने के लिए अक्सर अनुशंसित तरीका हैश फ़ंक्शन में पास करने से पहले पासवर्ड और काली मिर्च को गठबंधन करना है:

$pepperedPassword = hash_hmac('sha512', $password, $pepper);
$passwordHash = bcrypt($pepperedPassword);

यद्यपि एक और बेहतर तरीका है हालांकि:

$passwordHash = bcrypt($password);
$encryptedHash = encrypt($passwordHash, $serverSideKey);

यह न केवल सर्वर साइड रहस्य जोड़ने की अनुमति देता है, यह $ ServerSideKey का आदान-प्रदान करने की भी अनुमति देता है, यह आवश्यक होना चाहिए। इस विधि में थोड़ा और काम शामिल है, लेकिन यदि कोड एक बार मौजूद है (पुस्तकालय) इसका उपयोग करने का कोई कारण नहीं है।


नमक और काली मिर्च का बिंदु एक पूर्व-गणना पासवर्ड लुकअप की लागत में वृद्धि करना है, जिसे इंद्रधनुष तालिका कहा जाता है।

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

एक काली मिर्च का बिंदु इंद्रधनुष तालिका को अपनी पासवर्ड सूची अद्वितीय हैक करने के लिए आवश्यक है। इस प्रकार इंद्रधनुष तालिका बनाने के लिए हमलावर पर अधिक समय बर्बाद कर दिया।

नमक का बिंदु हालांकि प्रत्येक उपयोगकर्ता के लिए इंद्रधनुष तालिका बनाने के लिए उपयोगकर्ता के लिए अद्वितीय होना चाहिए, और हमले की जटिलता में वृद्धि होगी।

वास्तव में कंप्यूटर सुरक्षा का बिंदु लगभग गणितीय और शारीरिक रूप से अव्यवहारिक (गणितीय रूप से) असंभव बनाने के लिए कभी नहीं है (उदाहरण के लिए सुरक्षित सिस्टम में यह ब्रह्मांड में सभी एंट्रॉपी (और अधिक) को एक उपयोगकर्ता के पासवर्ड की गणना करने के लिए ले जाएगा)।







password-hash