अस्वीकरण : यह जवाब 2008 में लिखा गया था।
तब से, PHP ने हमें दिया है password_hash
और password_verify
, उनके परिचय के बाद से, वे अनुशंसित पासवर्ड हैशिंग और चेकिंग विधि हैं।
उत्तर का सिद्धांत अभी भी एक अच्छा पढ़ा गया है।
टी एल; डॉ
क्या न करें
- पासवर्ड के लिए उपयोगकर्ता कौन से वर्ण दर्ज कर सकते हैं, इसे सीमित न करें। केवल बेवकूफ ही ऐसा करते हैं।
- पासवर्ड की लंबाई सीमित न करें। यदि आपके उपयोगकर्ता इसमें supercalifragilisticexpialidocious के साथ एक वाक्य चाहते हैं, तो उन्हें इसका उपयोग करने से न रोकें।
- पासवर्ड में एचटीएमएल और विशेष वर्णों को पट्टी या बचना न करें।
- अपने उपयोगकर्ता के पासवर्ड को सादे-पाठ में संग्रहीत न करें।
- अपने उपयोगकर्ता को कभी भी पासवर्ड न भेजें, सिवाय इसके कि जब उन्होंने अपना खोया है, और आपने एक अस्थायी भेजा है।
- कभी भी, किसी भी तरीके से पासवर्ड लॉग न करें।
- SHA1 या MD5 या SHA256 के साथ कभी भी हैश पासवर्ड न रखें ! आधुनिक पटाखे 60 और 180 बिलियन हैश / सेकंड (क्रमशः) से अधिक हो सकते हैं।
- Bcrypt को मिक्स न करें और हैश () के कच्चे आउटपुट के साथ , या तो हेक्स आउटपुट या बेस 64_कोड का उपयोग करें। (यह किसी भी इनपुट पर लागू होता है
\0
जिसमें इसमें एक दुष्ट हो सकता है , जो सुरक्षा को गंभीर रूप से कमजोर कर सकता है।)
करने योग्य
- जब आप कर सकते हैं, तो स्क्रीप्ट का उपयोग करें; bcrypt यदि आप नहीं कर सकते।
- PBKDF2 का उपयोग करें यदि आप SHA2 हैश के साथ bcrypt या scrypt का उपयोग नहीं कर सकते हैं।
- डेटाबेस से छेड़छाड़ होने पर सभी के पासवर्ड रीसेट करें।
- एक उचित 8-10 वर्ण न्यूनतम लंबाई को लागू करें, साथ ही कम से कम 1 ऊपरी मामले पत्र, 1 निचला मामला पत्र, एक संख्या और एक प्रतीक की आवश्यकता होती है। यह पासवर्ड के एन्ट्रापी को बेहतर करेगा, बदले में इसे क्रैक करना कठिन बना देगा। (कुछ बहस के लिए "क्या एक अच्छा पासवर्ड बनाता है?" अनुभाग देखें।)
हैश पासवर्ड वैसे भी क्यों है?
हैशिंग पासवर्ड के पीछे का उद्देश्य सरल है: डेटाबेस से समझौता करके उपयोगकर्ता खातों में दुर्भावनापूर्ण पहुंच को रोकना। तो पासवर्ड हैशिंग का लक्ष्य एक हैकर या पटाखे को बंद करने के लिए होता है, जिससे उन्हें सादे पाठ पासवर्डों की गणना करने के लिए बहुत अधिक समय या पैसा खर्च करना पड़ता है। और समय / लागत आपके शस्त्रागार में सबसे अच्छा अवरोधक हैं।
एक और कारण जो आप एक उपयोगकर्ता खातों पर एक अच्छा, मजबूत हैश चाहते हैं, आपको सिस्टम में सभी पासवर्ड बदलने के लिए पर्याप्त समय देना है। यदि आपके डेटाबेस से छेड़छाड़ की जाती है, तो आपको सिस्टम को कम से कम लॉक करने के लिए पर्याप्त समय की आवश्यकता होगी , यदि डेटाबेस में प्रत्येक पासवर्ड को नहीं बदला जाए।
व्हाइटहाट सिक्योरिटी के सीटीओ जेरेमिया ग्रॉसमैन ने हाल ही में पासवर्ड रिकवरी के बाद व्हाइट हैट ब्लॉग पर कहा था कि उनके पासवर्ड की सुरक्षा को तोड़ने के लिए आवश्यक बल:
दिलचस्प बात यह है कि इस दुःस्वप्न को जीने में, मैंने A LOT सीखा, जो मुझे पासवर्ड क्रैकिंग, स्टोरेज और जटिलता के बारे में नहीं पता था। मैं सराहना करने आया हूं कि पासवर्ड संग्रहण पासवर्ड जटिलता से कभी इतना अधिक महत्वपूर्ण क्यों है। यदि आपको पता नहीं है कि आपका पासवर्ड कैसे संग्रहीत किया जाता है, तो आप वास्तव में जटिलता पर निर्भर कर सकते हैं। यह पासवर्ड और क्रिप्टो पेशेवरों के लिए सामान्य ज्ञान हो सकता है, लेकिन औसत इन्फोसेक या वेब सुरक्षा विशेषज्ञ के लिए, मुझे इसमें संदेह है।
(जोर मेरा)
वैसे भी एक अच्छा पासवर्ड क्या है ?
एन्ट्रापी । (ऐसा नहीं है कि मैं रान्डेल के दृष्टिकोण के लिए पूरी तरह से सदस्यता लेता हूं।)
संक्षेप में, एन्ट्रापी पासवर्ड के भीतर कितनी भिन्नता है। जब कोई पासवर्ड केवल रोमन अक्षर को कम करता है, तो वह केवल 26 अक्षर होता है। यह बहुत भिन्नता नहीं है। 36 अक्षरों के साथ अल्फा-न्यूमेरिक पासवर्ड बेहतर हैं। लेकिन प्रतीकों के साथ ऊपरी और निचले मामले की अनुमति देना, लगभग 96 वर्ण है। यह सिर्फ पत्रों से बहुत बेहतर है। एक समस्या यह है कि अपने पासवर्ड को यादगार बनाने के लिए हम पैटर्न डालते हैं - जिससे एंट्रोपी कम हो जाती है। ऊप्स!
पासवर्ड एन्ट्रापी आसानी से अनुमानित है। एससीआई वर्णों की पूरी श्रृंखला (लगभग 96 टाइप करने योग्य वर्ण) का उपयोग करने पर 6.6 प्रति वर्ण की एन्ट्रापी मिलती है, जो पासवर्ड के लिए 8 वर्णों पर भविष्य की सुरक्षा के लिए अभी भी बहुत कम (52.679 बिट्स एन्ट्रापी) है। लेकिन अच्छी खबर यह है: लंबे पासवर्ड, और यूनिकोड अक्षरों के साथ पासवर्ड, वास्तव में एक पासवर्ड की एन्ट्रापी को बढ़ाते हैं और इसे क्रैक करना कठिन बनाते हैं।
Crypto StackExchange साइट पर पासवर्ड एन्ट्रापी की लंबी चर्चा है । Google की एक अच्छी खोज भी बहुत सारे परिणामों को बदल देगी।
टिप्पणियों में मैंने @popnoodles के साथ बात की, जिन्होंने बताया कि X अक्षर, संख्या, प्रतीक, आदि के साथ X लंबाई की एक पासवर्ड नीति लागू करना, वास्तव में पासवर्ड योजना को अधिक अनुमानित बनाकर एन्ट्रापी को कम कर सकता है। मेरी सहमति है। बेतरतीब, जितना संभव हो उतना यादृच्छिक, हमेशा सबसे सुरक्षित लेकिन कम से कम यादगार समाधान होता है।
अब तक मैं बता पा रहा हूं कि दुनिया का सबसे अच्छा पासवर्ड बनाना कैच -22 है। या तो इसके यादगार नहीं, बहुत अनुमानित, बहुत कम, बहुत सारे यूनिकोड वर्ण (विंडोज / मोबाइल डिवाइस पर टाइप करने के लिए कठिन), बहुत लंबा, आदि। कोई भी पासवर्ड वास्तव में हमारे उद्देश्यों के लिए पर्याप्त नहीं है, इसलिए हमें उनकी रक्षा करना चाहिए जैसे कि वे फोर्ट नॉक्स में थे।
सर्वोत्तम प्रथाएं
Bcrypt और scrypt वर्तमान सर्वोत्तम प्रथाएं हैं। Scrypt समय में bcrypt से बेहतर हो जाएगा, लेकिन यह लिनक्स / यूनिक्स द्वारा या वेबसर्वर द्वारा एक मानक के रूप में गोद लेने नहीं देखा गया है, और इसके एल्गोरिथ्म की समीक्षा में गहराई से अब तक पोस्ट नहीं पड़ा है। लेकिन फिर भी, एल्गोरिथ्म का भविष्य आशाजनक दिखता है। यदि आप रूबी के साथ काम कर रहे हैं तो एक स्क्रीप्ट रत्न है जो आपकी मदद करेगा, और Node.js का अब अपना स्वयं का स्क्रीप्ट पैकेज है। आप PHP में Scrypt एक्सटेंशन या Libsodium extension (दोनों PECL में उपलब्ध हैं) के माध्यम से Scrypt का उपयोग कर सकते हैं ।
यदि आप bcrypt का उपयोग कैसे करना चाहते हैं, या अपने आप को एक अच्छा आवरण ढूंढना चाहते हैं या PHPASS जैसी चीज़ों का अधिक विरासत के कार्यान्वयन के लिए उपयोग करना चाहते हैं, तो मैं क्रिप्ट फ़ंक्शन के प्रलेखन को पढ़ने का सुझाव देता हूं । मैं 15 से 18 नहीं, तो न्यूनतम 12 बीसी क्रिप्ट की सिफारिश करता हूं।
मैंने bcrypt का उपयोग करने के बारे में अपना मन बदल लिया जब मैंने सीखा कि bcrypt केवल एक परिवर्तनीय लागत तंत्र के साथ ब्लोफिश के प्रमुख शेड्यूल का उपयोग करता है। उत्तरार्द्ध आपको ब्लोफिश के पहले से महंगे कुंजी शेड्यूल को बढ़ाकर पासवर्ड को ब्रूट-फोर्स करने की लागत बढ़ा देता है।
औसत प्रथाओं
मैं लगभग अब इस स्थिति की कल्पना नहीं कर सकता। PHPASS 5.3 के माध्यम से PHP 3.0.18 का समर्थन करता है, इसलिए यह लगभग हर इंस्टॉलेशन पर प्रयोग करने योग्य है - और इसका उपयोग तब किया जाना चाहिए जब आपको यह निश्चित रूप से पता न चले कि आपका वातावरण bcrypt का समर्थन करता है।
लेकिन मान लीजिए कि आप bcrypt या PHPASS का उपयोग बिल्कुल नहीं कर सकते हैं। फिर क्या?
PDKBF2 को राउंड की अधिकतम संख्या के साथ लागू करने का प्रयास करें जिसे आपका पर्यावरण / अनुप्रयोग / उपयोगकर्ता-धारणा बर्दाश्त कर सकती है। सबसे कम संख्या मैं सुझाऊंगा 2500 राउंड। इसके अलावा, हैश_हमैक () का उपयोग करना सुनिश्चित करें यदि यह ऑपरेशन को पुन: पेश करने के लिए कठिन बनाने के लिए उपलब्ध है।
भविष्य के आचरण
PHP 5.5 में आना एक पूर्ण पासवर्ड सुरक्षा पुस्तकालय है जो bcrypt के साथ काम करने के किसी भी दर्द को दूर करता है। जबकि हम में से अधिकांश PHP 5.2 और 5.3 के साथ सबसे आम वातावरण में चिपके हुए हैं, विशेष रूप से साझा होस्ट, @ircmaxell ने आने वाले एपीआई के लिए एक संगतता परत का निर्माण किया है जो PHP 5.3.7 के लिए पिछड़े संगत है।
क्रिप्टोग्राफी रिकैप और अस्वीकरण
एक हैशेड पासवर्ड को क्रैक करने के लिए आवश्यक कम्प्यूटेशनल पावर मौजूद नहीं है। एक पासवर्ड को "क्रैक" करने के लिए कंप्यूटर का एकमात्र तरीका इसे फिर से बनाना और इसे सुरक्षित करने के लिए उपयोग किए गए हैशिंग एल्गोरिथ्म का अनुकरण करना है। हैश की गति रैखिक रूप से क्रूर-मजबूर होने की क्षमता से संबंधित है। इससे भी बुरी बात यह है कि अधिकांश हैश एल्गोरिदम को आसानी से समानांतर करने के लिए और भी तेज प्रदर्शन किया जा सकता है। यही कारण है कि bcrypt और scrypt जैसी महंगी योजनाएं इतनी महत्वपूर्ण हैं।
आप संभावित रूप से सभी खतरों या हमले के अवसरों का पूर्वाभास नहीं कर सकते हैं, और इसलिए आपको अपने उपयोगकर्ताओं को सामने रखने के लिए अपनी पूरी कोशिश करनी चाहिए । यदि आप नहीं करते हैं, तो आप इस तथ्य को भी याद कर सकते हैं कि आप पर हमला किया गया था जब तक कि बहुत देर हो चुकी हो ... और आप उत्तरदायी हैं । उस स्थिति से बचने के लिए, शुरू करने के लिए पागल होने का कार्य करें। अपने स्वयं के सॉफ़्टवेयर (आंतरिक रूप से) पर हमला करें और उपयोगकर्ता क्रेडेंशियल्स चोरी करने का प्रयास करें, या अन्य उपयोगकर्ता के खातों को संशोधित करें या उनके डेटा तक पहुंचें। यदि आप अपने सिस्टम की सुरक्षा का परीक्षण नहीं करते हैं, तो आप किसी को भी दोषी नहीं ठहरा सकते हैं।
अंत में: मैं एक क्रिप्टोग्राफर नहीं हूं। मैंने जो भी कहा है वह मेरी राय है, लेकिन मुझे लगता है कि यह अच्छे राजभाषा 'सामान्य ज्ञान ... और बहुत सारे पढ़ने पर आधारित है। याद रखें, जितना संभव हो उतना पागल हो सकता है, चीजों को जितना संभव हो उतना मुश्किल से घुसपैठ करें और फिर, यदि आप अभी भी चिंतित हैं, तो एक सफेद-टोपी हैकर या क्रिप्टोग्राफर से संपर्क करके देखें कि वे आपके कोड / सिस्टम के बारे में क्या कहते हैं।