PHP पासवर्ड के लिए सुरक्षित हैश और नमक


1174

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

यह प्रश्न, क्या "डबल हैशिंग" पासवर्ड एक बार से अधिक हैशिंग से कम सुरक्षित है? सुझाव देते हैं कि कई बार हैशिंग एक अच्छा विचार हो सकता है, जबकि व्यक्तिगत फ़ाइलों के लिए पासवर्ड सुरक्षा को कैसे लागू किया जाए? नमक का उपयोग करने का सुझाव देता है।

मैं PHP का उपयोग कर रहा हूँ। मुझे एक सुरक्षित और तेज़ पासवर्ड एन्क्रिप्शन सिस्टम चाहिए। एक पासवर्ड को लाख बार सुरक्षित करना सुरक्षित हो सकता है, लेकिन धीमा भी। गति और सुरक्षा के बीच एक अच्छा संतुलन कैसे प्राप्त करें? इसके अलावा, मैं चाहता हूं कि परिणाम में निरंतर वर्ण हों।

  1. हैशिंग इंस्ट्रूमेंट PHP में उपलब्ध होना चाहिए
  2. यह सुरक्षित होना चाहिए
  3. यह नमक का उपयोग कर सकता है (इस मामले में, क्या सभी लवण समान रूप से अच्छे हैं? क्या अच्छा नमक उत्पन्न करने का कोई तरीका है?)

इसके अलावा, क्या मुझे डेटाबेस में दो फ़ील्ड स्टोर करने चाहिए (एक MD5 का उपयोग करके और दूसरा एक SHA का उपयोग करके, उदाहरण के लिए)? क्या यह इसे सुरक्षित या अनिश्चित बना देगा?

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

संबंधित प्रश्न जो मेरे प्रश्न को काफी कवर नहीं करते हैं:

PHP
सरल पासवर्ड एन्क्रिप्शन में SHA और MD5 के बीच क्या अंतर है
, कुंजी को संग्रहीत करने के सुरक्षित तरीके, asp.net के लिए
पासवर्ड। आप Tomcat 5.5 में नमकीन पासवर्ड कैसे लागू करेंगे


13
openwall.com/phpass भी बहुत अच्छी लाइब्रेरी है
अल्फ्रेड

51
Md5 अब पूरी तरह से असुरक्षित है
JqueryToAddNumbers

3
@NSAwesomeGuy जो आप इसके लिए उपयोग कर रहे हैं पर निर्भर करता है। यह इंद्रधनुष-मैच के लिए तुच्छ है या केवल brute बल अनसाल्टेड MD5 पासवर्ड, निश्चित रूप से, लेकिन सभ्य नमकीन के साथ यह अभी भी पासवर्ड के सेट के तेजी से क्रैकिंग के लिए इंद्रधनुष तालिका बनाने के लिए अव्यावहारिक है, और जानवर बल एक नो-हॉपर है।
क्रेग रिंगर


जवाबों:


982

अस्वीकरण : यह जवाब 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 जैसी महंगी योजनाएं इतनी महत्वपूर्ण हैं।

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

अंत में: मैं एक क्रिप्टोग्राफर नहीं हूं। मैंने जो भी कहा है वह मेरी राय है, लेकिन मुझे लगता है कि यह अच्छे राजभाषा 'सामान्य ज्ञान ... और बहुत सारे पढ़ने पर आधारित है। याद रखें, जितना संभव हो उतना पागल हो सकता है, चीजों को जितना संभव हो उतना मुश्किल से घुसपैठ करें और फिर, यदि आप अभी भी चिंतित हैं, तो एक सफेद-टोपी हैकर या क्रिप्टोग्राफर से संपर्क करके देखें कि वे आपके कोड / सिस्टम के बारे में क्या कहते हैं।


9
एक गुप्त मदद नहीं करता है क्योंकि आपके पासवर्ड DB को वैसे भी गुप्त माना जाता है - यदि वे उस DB को पकड़ सकते हैं, तो वे जो भी रहस्य आप उपयोग कर रहे हैं वह भी पा सकते हैं। हालांकि यह महत्वपूर्ण है कि नमक यादृच्छिक हो।
फ्रैंकडॉयर

2
ध्यान दें, यह वास्तव में सच नहीं है कि 'डिक्रिप्ट करने की कम्प्यूटेशनल शक्ति' अभी तक मौजूद नहीं है। चूँकि अधिकांश पासवर्ड शब्दकोष या शब्दकोष से बने होते हैं, डिक्शनरी आधारित हमला आमतौर पर बहुत प्रभावी होता है (इसलिए पासवर्ड नीतियों और पुनरावृति मायने रखता है)।
फ्रैंककोडियर

6
@ पिस्सू पिस्सू, मैं तुम्हारे साथ बहस नहीं कर रहा हूँ। केवल यह इंगित करना कि हमारे कार्य का यह क्षेत्र कितना जटिल और जटिल है। मैं एक छोटे से वेब साइट की सामग्री प्रबंधन प्रणाली स्थापित करने के लिए सभी-सभी, अंत-सबसे चतुर, सबसे अच्छे अभ्यास से स्कूली शिक्षा प्राप्त करने की उम्मीद रखता हूं। मैं अब भी यहां सीख रहा हूं। ... हर बार जब मैं कुछ पढ़ता हूं तो समझ में आता है, मैं जल्द ही 5 अन्य पोस्टों पर ध्यान देता हूं जो इसके विपरीत हैं। वह दौर और दौर जल्दी चक्कर आ जाता है :)
m42

4
दिलचस्प संशोधन। क्या उपयोगकर्ता आईडी (कहते हैं, एक ऑटो वेतन वृद्धि) एक अच्छा गैर है? या क्योंकि यह यादृच्छिक नहीं है यह अच्छा नहीं है? इसके अलावा, मुझे डेटाबेस में प्रत्येक उपयोगकर्ता के लिए नॉन को स्टोर करना होगा ... क्या साइट की + नॉन + एचएमएसी एक नमकीन (उपयोगकर्ता आईडी के साथ) कई बार हैश किए हुए पर बेहतर सुधार सुरक्षा प्रदान करती है? इसी तरह, सुरक्षा के लिए कई बार एचएमएसी को पुनरावृत्त करना अच्छा है?
20

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

138

बहुत छोटा और सुरक्षित उत्तर - अपना पासवर्ड तंत्र बिल्कुल न लिखें , कोशिश की और परीक्षण किए गए तंत्र का उपयोग करें।

  • PHP 5.5 या उच्चतर: password_hash () अच्छी गुणवत्ता और PHP कोर का हिस्सा है।
  • पुराने PHP संस्करण: OpenWall की फ़ॉस्ज़ लाइब्रेरी अधिकांश कस्टम कोड - WordPress, Drupal, आदि में उपयोग किए जाने से बहुत बेहतर है।

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

त्वरित स्व-परीक्षण: पासवर्ड स्ट्रेचिंग क्या है और आपको कितने पुनरावृत्तियों का उपयोग करना चाहिए? यदि आपको उत्तर नहीं पता है, तो आपको उपयोग करना चाहिए password_hash(), क्योंकि पासवर्ड स्ट्रेचिंग अब बहुत तेजी से सीपीयू और GPU के उपयोग के कारण पासवर्ड तंत्रों की एक महत्वपूर्ण विशेषता है और प्रति सेकंड अनुमानों के अरबों की दर से पासवर्ड को क्रैक करने के लिए GPU और FPGAs का उपयोग (GPU के साथ) )।

उदाहरण के लिए, आप 5 डेस्कटॉप पीसी में स्थापित 25 जीपीयू का उपयोग करके 6 घंटे में सभी 8-चरित्र वाले विंडोज पासवर्ड को क्रैक कर सकते हैं । यह ब्रूट-फोर्सिंग है अर्थात विशेष वर्णों सहित हर 8-वर्ण के विंडोज पासवर्ड की गणना और जाँच करना , और शब्दकोश हमला नहीं है। यह 2012 में था, 2018 तक आप कम जीपीयू का उपयोग कर सकते हैं, या 25 जीपीयू के साथ तेजी से क्रैक कर सकते हैं।

विंडोज पासवर्ड पर कई इंद्रधनुष तालिका हमले भी होते हैं जो साधारण सीपीयू पर चलते हैं और बहुत तेज़ होते हैं। सभी इस क्योंकि Windows है अभी भी नमक नहीं करता है या खिंचाव अपने पासवर्ड, Windows 10 में भी - एक ही गलती नहीं है के रूप में माइक्रोसॉफ्ट था!

यह सभी देखें:

  • क्यों password_hash()या phpassजाने के लिए सबसे अच्छा तरीका है के बारे में अधिक के साथ उत्कृष्ट जवाब
  • अच्छा ब्लॉग आलेख, जो मुख्य एल्गोरिदम के लिए अनुशंसित कार्य कारक (पुनरावृत्तियों की संख्या) दे रहा है, जिसमें bcrypt, scrypt और PBKDF2 शामिल हैं।

1
लेकिन इन प्रणालियों को बेहतर जाना जाता है और शायद पहले से ही समझौता किया गया है। लेकिन यह धड़कता है कि जब आप नहीं जानते कि आप क्या कर रहे हैं।
JqueryToAddNumbers 22

14
पुनः "ये सिस्टम बेहतर ज्ञात हैं और शायद पहले से ही समझौता किए गए हैं" - कोई कारण नहीं है कि प्रमाणीकरण के लिए एक अच्छी तरह से डिजाइन की गई प्रणाली "पहले से ही समझौता" बन जाए क्योंकि यह बेहतर ज्ञात है। पुस्तकालयों जैसे फ़ॉग को विशेषज्ञों द्वारा लिखा जाता है और कई लोगों द्वारा विस्तार से समीक्षा की जाती है - वे जिस तथ्य को अच्छी तरह से जानते हैं वह अलग-अलग लोगों द्वारा विस्तृत समीक्षा के साथ जाता है और इसका मतलब है कि वे सुरक्षित हैं।
रिचवेल

लिंक्डइन, लास्ट.फैम और अन्य से हाल के पासवर्ड हैश डंप को देखते हुए, यह काफी सामयिक है। आप अपने खुद के पासवर्ड तंत्र लिखने के लिए नहीं जानने में अच्छी कंपनी में हैं!
रिचवेल

3
@PP - एक सहकर्मी की समीक्षा की पासवर्ड हैशिंग एल्गोरिथ्म एक एनएसए पिछले दरवाजे होने की संभावना बहुत कम है, मेरे विचार में। किसी व्यक्ति की संभावना जो वास्तविक क्रिप्टो विशेषज्ञ नहीं है, जो अन्य भेद्यताओं के बिना एक नया पासवर्ड हैशिंग तंत्र लिख रहा है, बहुत कम है। और ठेठ वेबएप सिर्फ एमडी 5 या एसएचए -1 हैशिंग का उपयोग करता है, जो भयानक है - यहां तक ​​कि क्रिस शिफलेट की अन्यथा महान आवश्यक PHP सुरक्षा पुस्तक एमडी 5 की सिफारिश करती है ...
रिचवेल

1
@RichVel - पासवर्ड_श () फ़ंक्शन। जैसा कि पहले उल्लेख किया गया है, यह PHP कोर (उर्फ / एक्सट / मानक) में बनाया गया है।
क्यूबिकलसॉफ्ट

43

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


पासवर्ड हैशिंग के लिए नहीं। पासवर्ड पुनर्प्राप्त करने के लिए हमलावर को केवल एक हैश को तोड़ने की आवश्यकता होती है। बिंदु वैसे भी moot है जैसा कि MD5 और SHA1 में पासवर्ड परिदृश्य में कोई व्यावहारिक ब्रेक उपलब्ध नहीं है।
फ्रैंकडॉयर

2
क्षमा करें, मैं दो हैश का उपयोग करने की अनुशंसा के रूप में आपके उत्तर को गलत मानता हूं ... आप वास्तव में सही हैं। दो हैश का उपयोग पासवर्ड के मामले में सिस्टम को कमजोर करता है, क्योंकि उन्हें केवल कमजोर हैश को तोड़ने की आवश्यकता होती है।
फ्रैंकडॉयर

40

PHP 5.5 के अनुसार, PHP के पास हैशिंग और वेरिफाईड पासवर्ड, पासवर्ड_हश () और पासवर्ड_वरिफाई () के लिए सरल, सुरक्षित कार्य हैं

$password = 'anna';
$hash = password_hash($password, PASSWORD_DEFAULT);
$expensiveHash = password_hash($password, PASSWORD_DEFAULT, array('cost' => 20));

password_verify('anna', $hash); //Returns true
password_verify('anna', $expensiveHash); //Also returns true
password_verify('elsa', $hash); //Returns false

जब password_hash()उपयोग किया जाता है, तो यह एक यादृच्छिक नमक उत्पन्न करता है और इसे आउटपुट हैश (लागत और एल्गोरिथ्म के साथ) में शामिल करता है। password_verify()फिर उस हैश को पढ़ता है और उपयोग किए गए नमक और एन्क्रिप्शन विधि को निर्धारित करता है, और इसे प्रदान किए गए सादे पासवर्ड के विरुद्ध सत्यापित करता है।

PASSWORD_DEFAULTPHP के स्थापित संस्करण के डिफ़ॉल्ट हैशिंग एल्गोरिथ्म का उपयोग करने के लिए निर्देश प्रदान करना । वास्तव में जो एल्गोरिथ्म का मतलब है कि भविष्य के संस्करणों में समय के साथ बदलने का इरादा है, ताकि यह हमेशा सबसे मजबूत उपलब्ध एल्गोरिदम में से एक होगा।

बढ़ती लागत (जो 10 के लिए चूक) हैश को क्रूरता के लिए कठिन बना देती है, लेकिन इसका मतलब है कि हैश उत्पन्न करना और उनके खिलाफ पासवर्ड सत्यापित करना आपके सर्वर के सीपीयू के लिए अधिक काम होगा।

ध्यान दें कि भले ही डिफ़ॉल्ट हैशिंग एल्गोरिथ्म बदल सकता है, पुराने हैश सिर्फ ठीक सत्यापित करने के लिए जारी रहेगा क्योंकि उपयोग किया गया एल्गोरिथ्म हैश में संग्रहीत होता है और password_verify()उस पर चुनता है।


33

हालांकि इस सवाल का जवाब दिया गया है, मैं सिर्फ यह दोहराना चाहता हूं कि हैशिंग के लिए उपयोग किए जाने वाले लवण यादृच्छिक होना चाहिए और पहले उत्तर में सुझाए गए ईमेल पते की तरह नहीं।

अधिक स्पष्टीकरण उपलब्ध है- http://www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

हाल ही में मैंने एक चर्चा की थी कि क्या रैंडम बिट्स के साथ पासवर्ड हैश की गई नमकीन अनुमान योग्य या ज्ञात लवण के साथ नमकीन की तुलना में अधिक सुरक्षित है। चलो देखते हैं: यदि सिस्टम स्टोरिंग पासवर्ड के साथ-साथ उस सिस्टम से समझौता किया जाता है जो यादृच्छिक नमक को संग्रहीत करता है, तो हमलावर के पास हैश के साथ-साथ नमक तक भी पहुंच होगी, इसलिए कि नमक यादृच्छिक है या नहीं, इससे कोई फर्क नहीं पड़ता। हमलावर हैश क्रैक करने के लिए पूर्व-गणना इंद्रधनुष तालिकाओं को उत्पन्न कर सकता है। यहां दिलचस्प हिस्सा आता है- पूर्व-गणना की गई तालिकाओं को उत्पन्न करना इतना तुच्छ नहीं है। आइए हम WPA सुरक्षा मॉडल का उदाहरण लेते हैं। आपका WPA पासवर्ड वास्तव में कभी भी Wireless Access Point को नहीं भेजा जाता है। इसके बजाय, यह आपके SSID (नेटवर्क नाम- जैसे Linksys, Dlink आदि) के साथ हैशेड किया गया है। यह यहाँ कैसे काम करता है की एक बहुत अच्छी व्याख्या। हैश से पासवर्ड पुनः प्राप्त करने के लिए, आपको पासवर्ड के साथ-साथ नमक (नेटवर्क नाम) भी जानना होगा। Wifi का चर्च पहले से ही हैश टेबल की गणना कर चुका है जिसमें शीर्ष 1000 SSID और लगभग 1 मिलियन पासवर्ड हैं। आकार सभी तालिकाओं का है, लगभग 40 जीबी है। जैसा कि आप उनकी साइट पर पढ़ सकते हैं, किसी ने इन तालिकाओं को बनाने के लिए 3 दिनों के लिए 15 एफजीपीए सरणियों का उपयोग किया। पीड़ित मानकर SSID का उपयोग “a387csf3 using और पासवर्ड के रूप में“ 123456 using के रूप में कर रहा है, क्या यह उन तालिकाओं द्वारा क्रैक किया जाएगा? नहीं! .. यह नहीं कर सकते। पासवर्ड कमजोर होने पर भी, SSID a387csf3 के लिए टेबल में हैश नहीं है। यह यादृच्छिक नमक होने की सुंदरता है। यह उन पटाखों को रोक देगा जो पहले से गणना की गई तालिकाओं पर पनपे हैं। क्या यह एक निर्धारित हैकर को रोक सकता है? शायद ऩही। लेकिन यादृच्छिक लवण का उपयोग रक्षा की अतिरिक्त परत प्रदान करता है। जबकि हम इस विषय पर हैं, आइए हम एक अलग सिस्टम पर यादृच्छिक लवण के भंडारण के अतिरिक्त लाभ पर चर्चा करें। परिदृश्य # 1: पासवर्ड हैश को सिस्टम X पर संग्रहीत किया जाता है और हैशिंग के लिए उपयोग किए जाने वाले नमक के मूल्यों को सिस्टम Y पर संग्रहीत किया जाता है। ये नमक मान अनुमानित या ज्ञात होते हैं (जैसे उपयोगकर्ता नाम) परिदृश्य # 2: पासवर्ड हैश सिस्टम X पर संग्रहीत होते हैं और नमक के मान का उपयोग किया जाता है हैशिंग सिस्टम वाई पर संग्रहीत हैं। ये नमक मूल्य यादृच्छिक हैं। यदि सिस्टम एक्स से समझौता किया गया है, जैसा कि आप अनुमान लगा सकते हैं, एक अलग सिस्टम (यादृच्छिक / 2) पर यादृच्छिक नमक का उपयोग करने का एक बड़ा लाभ है। हमलावर को हैश क्रैक करने में सक्षम होने के लिए अतिरिक्त मूल्यों का अनुमान लगाने की आवश्यकता होगी। यदि 32 बिट नमक का उपयोग किया जाता है, तो प्रत्येक पासवर्ड के लिए 2 ^ 32 = 4,294,967,296 (लगभग 4.2 बिलियन) पुनरावृत्तियों की आवश्यकता हो सकती है। पासवर्ड हैश सिस्टम एक्स पर संग्रहीत किए जाते हैं और हैशिंग के लिए उपयोग किए जाने वाले नमक मूल्यों को सिस्टम वाई पर संग्रहीत किया जाता है। ये नमक मूल्य अनुमान योग्य हैं या ज्ञात हैं (जैसे उपयोगकर्ता नाम) परिदृश्य # 2: पासवर्ड हैश सिस्टम एक्स पर संग्रहीत किए जाते हैं और हैशिंग के लिए उपयोग किए जाने वाले नमक मूल्यों को संग्रहीत किया जाता है। system Y. ये नमक मान यादृच्छिक हैं। यदि सिस्टम एक्स से समझौता किया गया है, जैसा कि आप अनुमान लगा सकते हैं, एक अलग सिस्टम (यादृच्छिक / 2) पर यादृच्छिक नमक का उपयोग करने का एक बड़ा लाभ है। हमलावर को हैश क्रैक करने में सक्षम होने के लिए अतिरिक्त मूल्यों का अनुमान लगाने की आवश्यकता होगी। यदि 32 बिट नमक का उपयोग किया जाता है, तो प्रत्येक पासवर्ड के लिए 2 ^ 32 = 4,294,967,296 (लगभग 4.2 बिलियन) पुनरावृत्तियों की आवश्यकता हो सकती है। पासवर्ड हैश सिस्टम एक्स पर संग्रहीत किए जाते हैं और हैशिंग के लिए उपयोग किए जाने वाले नमक मूल्यों को सिस्टम वाई पर संग्रहीत किया जाता है। ये नमक मूल्य अनुमान योग्य हैं या ज्ञात हैं (जैसे उपयोगकर्ता नाम) परिदृश्य # 2: पासवर्ड हैश सिस्टम एक्स पर संग्रहीत किए जाते हैं और हैशिंग के लिए उपयोग किए जाने वाले नमक मूल्यों को संग्रहीत किया जाता है। system Y. ये नमक मान यादृच्छिक हैं। यदि सिस्टम X से छेड़छाड़ की गई है, तो जैसा कि आप अनुमान लगा सकते हैं, एक अलग सिस्टम पर यादृच्छिक नमक का उपयोग करने का एक बड़ा फायदा है (परिदृश्य 2)। हमलावर को हैश को क्रैक करने में सक्षम होने के लिए अतिरिक्त मूल्यों का अनुमान लगाने की आवश्यकता होगी। यदि 32 बिट नमक का उपयोग किया जाता है, तो प्रत्येक पासवर्ड के लिए 2 ^ 32 = 4,294,967,296 (लगभग 4.2 बिलियन) पुनरावृत्तियों की आवश्यकता हो सकती है। ये नमक मूल्य यादृच्छिक हैं। यदि सिस्टम X से छेड़छाड़ की गई है, तो जैसा कि आप अनुमान लगा सकते हैं, एक अलग सिस्टम पर यादृच्छिक नमक का उपयोग करने का एक बड़ा फायदा है (परिदृश्य 2)। हमलावर को हैश को क्रैक करने में सक्षम होने के लिए अतिरिक्त मूल्यों का अनुमान लगाने की आवश्यकता होगी। यदि 32 बिट नमक का उपयोग किया जाता है, तो प्रत्येक पासवर्ड के लिए 2 ^ 32 = 4,294,967,296 (लगभग 4.2 बिलियन) पुनरावृत्तियों की आवश्यकता हो सकती है। ये नमक मूल्य यादृच्छिक हैं। यदि सिस्टम X से छेड़छाड़ की गई है, तो जैसा कि आप अनुमान लगा सकते हैं, एक अलग सिस्टम पर यादृच्छिक नमक का उपयोग करने का एक बड़ा फायदा है (परिदृश्य 2)। हमलावर को हैश को क्रैक करने में सक्षम होने के लिए अतिरिक्त मूल्यों का अनुमान लगाने की आवश्यकता होगी। यदि 32 बिट नमक का उपयोग किया जाता है, तो प्रत्येक पासवर्ड के लिए 2 ^ 32 = 4,294,967,296 (लगभग 4.2 बिलियन) पुनरावृत्तियों की आवश्यकता हो सकती है।


7
यहां तक ​​कि अगर हमलावर को नमक मिलता है, तो एक "साइटसाल्ट: यूजराल्ट: पासवर्ड" स्ट्रिंग अभी भी पूर्व-निर्मित तालिकाओं के लिए प्रतिरोधी है, क्योंकि हमलावर को प्रत्येक उपयोगकर्ता के लिए तालिकाओं को बनाने की आवश्यकता होती है (इसलिए हमला बहुत धीमा हो जाता है), जब तक कि एक विशिष्ट उपयोगकर्ता नहीं होता। लक्षित किया जा रहा है ...
luiscubal

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

आपने जो लिखा था, वह आपको याद है। मैंने कहा कि रिकॉर्ड के साथ संग्रहित एक यादृच्छिक नॉन का उपयोग करें, साथ ही ईमेल पता भी। ईमेल एड्रेस का जोड़ हैकर के काम करने के लिए अतिरिक्त एन्ट्रापी बनाता है। जब से मैंने bcrypt के पक्ष में अपना उत्तर पुनः लिखा है।
रॉबर्ट के

28

मैं सिर्फ यह बताना चाहता हूं कि PHP 5.5 में एक पासवर्ड हैशिंग एपीआई भी शामिल है जो चारों ओर एक आवरण प्रदान करता है crypt()। यह एपीआई हैशिंग के कार्य को सरल करता है, पासवर्ड हैश को सत्यापित और पुन: व्यवस्थित करता है। लेखक ने PHP 5.3.7 और बाद में उपयोग करने वालों के लिए एक संगतता पैक (एकल पासवर्ड.फैप फ़ाइल जिसे आप बस requireउपयोग करना चाहते हैं) के रूप में जारी किया है और अभी इस का उपयोग करना चाहते हैं।

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

एपीआई चार कार्यों को उजागर करता है:

  • password_get_info() - दिए गए हैश के बारे में जानकारी देता है
  • password_hash() - एक पासवर्ड हैश बनाता है
  • password_needs_rehash()- अगर दिए गए हैश दिए गए विकल्पों से मेल खाता है तो जांच करता है। यह जांचने के लिए उपयोगी है कि क्या हैश आपकी वर्तमान तकनीक / लागत योजना के अनुरूप है, यदि आवश्यक हो तो आपको फिर से शुरू करने की अनुमति देता है
  • password_verify() - सत्यापित करता है कि पासवर्ड हैश से मेल खाता है

फिलहाल ये फ़ंक्शन PASSWORD_BCRYPT और PASSWORD_DEFAULT पासवर्ड कॉन्स्टेंट को स्वीकार करते हैं, जो इस समय पर्यायवाची हैं, अंतर यह है कि PASSWORD_DEFAULT "नए PHP रिलीज़ में" नए, अधिक मजबूत हैशिंग एल्गोरिथम का समर्थन कर सकता है। " लॉगिन पर PASSWORD_DEFAULT और पासवर्ड_needs_rehash () का उपयोग करना (और यदि आवश्यक हो तो पुन: दावा करना) यह सुनिश्चित करना चाहिए कि आपका हैश आपके लिए बिना किसी काम के छोटे-से-छोटे हमले के लिए पर्याप्त रूप से लचीला है।

EDIT: मुझे अभी पता चला है कि रॉबर्ट के के उत्तर में इसका संक्षिप्त उल्लेख किया गया है। जब से मुझे लगता है कि यह काम करता है और उपयोग में आसानी उन लोगों के लिए प्रदान करता है जो सुरक्षा नहीं जानते हैं, इसके बारे में अधिक जानकारी प्रदान करने के बाद से मैं इस उत्तर को यहां छोड़ दूंगा।


19

मैं Phpass का उपयोग कर रहा हूं जो कि एक साधारण एक-फाइल PHP क्लास है जिसे लगभग हर PHP प्रोजेक्ट में बहुत आसानी से लागू किया जा सकता है। द H भी देखें ।

डिफ़ॉल्ट रूप से इसका उपयोग सबसे मजबूत उपलब्ध एन्क्रिप्शन का उपयोग किया गया, जो कि फ़पास में लागू किया गया है, जो bcryptWordpress जैसे चौखटे को पिछड़ी संगतता प्रदान करने के लिए MD5 के नीचे अन्य एन्क्रिप्शन में वापस आता है।

लौटे हैश को डेटाबेस में संग्रहीत किया जा सकता है जैसा कि यह है। हैश उत्पन्न करने के लिए नमूना उपयोग है:

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

पासवर्ड सत्यापित करने के लिए, कोई भी उपयोग कर सकता है:

$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);

14

याद रखने वाली चीज़ें

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

सर्वर

बंदरगाहों

कोई फर्क नहीं पड़ता कि आपका एन्क्रिप्शन कितना अच्छा है यदि आप PHP और DB को चलाने वाले सर्वर को ठीक से सुरक्षित नहीं करते हैं, तो आपके सभी प्रयास बेकार हैं। अधिकांश सर्वर अपेक्षाकृत समान रूप से कार्य करते हैं, उनके पास ऐसे पोर्ट होते हैं जो आपको दूरस्थ रूप से एफ़टीपी या शेल के माध्यम से एक्सेस करने की अनुमति देते हैं। सुनिश्चित करें कि आप उस डिफ़ॉल्ट पोर्ट को बदल दें, जिसमें आपके पास कभी भी दूरस्थ कनेक्शन सक्रिय है। ऐसा नहीं करने से आप अपने सिस्टम तक पहुँचने में हमलावर को एक कम कदम उठा सकते हैं।

उपयोगकर्ता नाम

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

कुंजिका

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

डेटाबेस

सर्वर

आदर्श रूप से आप अपने DB और APPLICATION को अलग सर्वर पर चाहते हैं। यह हमेशा लागत के कारण संभव नहीं है, लेकिन यह कुछ सुरक्षा के लिए अनुमति देता है क्योंकि सिस्टम को पूरी तरह से एक्सेस करने के लिए हमलावर को दो चरणों से गुजरना होगा।

उपयोगकर्ता

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

फिर आपके लिए एक अलग उपयोगकर्ता खाता है जो सर्वर पर कहीं भी संग्रहीत नहीं है, यहां तक ​​कि एप्लिकेशन में भी नहीं।

हमेशा की तरह इस जड़ या कुछ इसी तरह नहीं बनाते हैं।

कुंजिका

सभी अच्छे पासवर्ड के साथ समान दिशानिर्देशों का पालन करें। इसके अलावा किसी भी सर्वर पर एक ही पासवर्ड या एक ही सिस्टम पर DB खातों का पुन: उपयोग न करें।

पीएचपी

कुंजिका

कभी अपने DB में एक पासवर्ड स्टोर करें, इसके बजाय हैश और अनूठे नमक को स्टोर करें, मैं समझाऊंगा कि बाद में क्यों।

हैशिंग

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

वहाँ बहुत अच्छे हैशिंग कार्य हैं ( password_hash, hashआदि, ...) लेकिन आपको प्रभावी होने के लिए हैश के लिए एक अच्छे एल्गोरिथ्म का चयन करने की आवश्यकता है। (bcrypt और इससे मिलते-जुलते लोग सभ्य एल्गोरिदम हैं।)

जब हैशिंग गति होती है, तो ब्रूट फोर्स के हमलों के लिए प्रतिरोधी अधिक धीमा हो जाता है।

हैशिंग में सबसे आम गलतियों में से एक यह है कि उपयोगकर्ताओं के लिए हैश अद्वितीय नहीं हैं। यह मुख्य रूप से है क्योंकि लवण विशिष्ट रूप से उत्पन्न नहीं होते हैं।

रेह

पासवर्ड को हमेशा हैशेड से पहले नमकीन होना चाहिए। साल्टिंग पासवर्ड में एक यादृच्छिक स्ट्रिंग जोड़ता है ताकि डीबी में समान पासवर्ड दिखाई न दें। हालांकि अगर नमक प्रत्येक उपयोगकर्ता के लिए अद्वितीय नहीं है (यानी: आप एक कठिन कोडित नमक का उपयोग करते हैं) तो आपने बहुत अधिक अपने नमक को बेकार कर दिया है। क्योंकि एक बार जब एक हमलावर एक पासवर्ड नमक का पता लगाता है, तो वह उन सभी के लिए नमक होता है।

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

उपयोगकर्ता बनाने के उपयोगकर्ता

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

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

अंत में, कोई फर्क नहीं पड़ता कि आप जो सुरक्षा उपाय करते हैं वह 100% सुरक्षित है, जितनी अधिक उन्नत तकनीक की रक्षा के लिए हमले उतने ही उन्नत हो जाते हैं। लेकिन इन चरणों का पालन करने से आपकी साइट अधिक सुरक्षित हो जाएगी और हमलावरों के बाद जाने के लिए कम वांछनीय होगी।

यहाँ एक PHP वर्ग है जो पासवर्ड के लिए हैश और नमक आसानी से बनाता है

http://git.io/mSJqpw


1
आपको सभ्य हैश एल्गोरिदम की अपनी सूची से SHA512 पर हमला करना चाहिए, क्योंकि यह बहुत तेज़ है। इसका उपयोग केवल PBKDF2 के संयोजन में करें। जबकि BCrypt ब्लोफिश पर आधारित है, ब्लोफिश खुद एन्क्रिप्शन के लिए एक एल्गोरिथ्म है, हैशिंग के लिए नहीं।
मार्टिंकोकली

1
आप डीबी में यादृच्छिक नमक कैसे स्टोर करते हैं? मुझे लगता है कि आपके पास यह नहीं है (सत्यापन के लिए इस्तेमाल नहीं किया जा सकता है) और न ही स्टोर में स्पष्ट (कोई वास्तविक लाभ नहीं है अगर हमलावर डीबी पढ़ सकता है)। तो, आप इसे कैसे करते हैं?
इज़ल

wmfrancia ने लिखा: "साल्टिंग पासवर्ड में एक यादृच्छिक स्ट्रिंग जोड़ता है ताकि डीबी में समान पासवर्ड दिखाई न दें"। इससे मुझे कोई मतलब नहीं है। DB में हैश पहले से ही असंतुष्ट दिखाई देंगे क्योंकि यह हैश कार्यों की एक संपत्ति है।
H2ONaCl

wmfancia ने एक निरंतर नमक के संबंध में लिखा है: "एक बार जब एक हमलावर एक पासवर्ड नमक का पता लगाता है, तो वह उन सभी के लिए नमक होता है"। वही कहा जा सकता है कि अगर हैकर यह पता लगाता है कि कौन सा डीबी क्षेत्र नमक है, तो उन सभी के लिए नमक है। चूँकि एक स्थिर नमक संभवतः DB में नहीं होगा, यह एक निरंतर नमक के बारे में एक अच्छी बात है।
H2ONaCl

बेशक, ये टिप्पणियां प्रति उपयोगकर्ता एक यादृच्छिक नमक का सुझाव नहीं हैं, प्रति आवेदन एक नमक से बेहतर नहीं है। यह बेहतर है।
H2ONaCl

12

Google का कहना है कि SHA256 PHP के लिए उपलब्ध है।

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


13
64 बिट किसी के लिए पर्याप्त होना चाहिए?
कोनरक

@Konerak, मैं 20 साल बाद इस पर वापस आऊंगा। :) लेकिन हाँ SHA256 वास्तव में उपलब्ध है। यदि आप जानना चाहते हैं कि SHA256 कितना सुरक्षित है, तो आप इसकी जांच कर सकते हैं: सुरक्षा
.stackexchange.com/questions/90064/…

8

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


2
कई हैशिंग शब्दकोष और पाशविक बल के हमलों से भी बचाते हैं - अर्थात यह उन्हें गणना करने में अधिक समय लेता है।
फ्रैंकडॉयर

6
डबल हैशिंग आपको एक महत्वपूर्ण लाभ नहीं देंगे, लेकिन बहु दौर हैशिंग पुनर्विचार अभी भी शब्दकोश और ब्रूस बल के हमलों के खिलाफ एक संभव बचाव है। औद्योगिक शक्ति पासवर्ड हैश का उपयोग 1000+ राउंड करता है। PKCS # 5 का PBKDF1 न्यूनतम 1000 राउंड का सुझाव देता है।
बर्क डी। डेमिर

8

मुझे यहाँ इस विषय पर सही विषय मिला: https://crackstation.net/hashing-security.htm , मैं चाहता था कि आप इससे लाभ प्राप्त करें, यहाँ स्रोत कोड भी है जो समय-आधारित हमले के खिलाफ भी रोकथाम प्रदान करता है।

<?php
/*
 * Password hashing with PBKDF2.
 * Author: havoc AT defuse.ca
 * www: https://defuse.ca/php-pbkdf2.htm
 */

// These constants may be changed without breaking existing hashes.
define("PBKDF2_HASH_ALGORITHM", "sha256");
define("PBKDF2_ITERATIONS", 1000);
define("PBKDF2_SALT_BYTES", 24);
define("PBKDF2_HASH_BYTES", 24);

define("HASH_SECTIONS", 4);
define("HASH_ALGORITHM_INDEX", 0);
define("HASH_ITERATION_INDEX", 1);
define("HASH_SALT_INDEX", 2);
define("HASH_PBKDF2_INDEX", 3);

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" . 
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false; 
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0; 
}

/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by https://defuse.ca
 * With improvements by http://www.variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>

आप हमें बिना किसी उपयोग के कोई समाधान नहीं देते
माइकल

6

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

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


2
निरंतर नमक एक महान विचार नहीं है ... शायद एक घातक दोष नहीं है लेकिन यह योजना को अनावश्यक रूप से कमजोर करता है।
फ्रैंककोडियर

MD5 और SHA1 तेज हैं, इसलिए यह एक खराब आहार है।
कोडइन्चोस

4

दूर के भविष्य के लिए SHA1 और एक नमक पर्याप्त होना चाहिए (यह स्वाभाविक रूप से, कि क्या आप फोर्ट नॉक्स के लिए कुछ कोडिंग कर रहे हैं या अपनी खरीदारी की सूची के लिए एक लॉगिन सिस्टम)। यदि SHA1 आपके लिए पर्याप्त नहीं है, तो SHA256 का उपयोग करें ।

नमक के विचार से हैशिंग परिणाम को फेंकना शेष है, ऐसा कहना है। यह ज्ञात है, उदाहरण के लिए, कि खाली स्ट्रिंग का MD5-hash है d41d8cd98f00b204e9800998ecf8427e। इसलिए, अगर किसी के पास पर्याप्त मेमोरी है तो वह हैश को देखेगा और जान सकता है कि यह एक खाली स्ट्रिंग का हैश है। लेकिन यदि स्ट्रिंग नमकीन है (स्ट्रिंग के साथ " MY_PERSONAL_SALT" कहें ), 'खाली स्ट्रिंग' (यानी " MY_PERSONAL_SALT") के लिए हैश aeac2612626724592271634fb14d3ea6, इसलिए बैकट्रेस के लिए गैर-स्पष्ट है। मैं जो कहना चाह रहा हूं, वह यह है कि किसी भी नमक का उपयोग न करें तो बेहतर है। इसलिए, यह जानना बहुत जरूरी नहीं है कि किस नमक का उपयोग किया जाए।

वास्तव में ऐसी वेबसाइटें हैं जो ऐसा करती हैं - आप इसे (md5) हैश खिला सकते हैं, और यह एक ज्ञात प्लेटेक्स्ट को बाहर निकालता है जो उस विशेष हैश को उत्पन्न करता है। यदि आपको एक ऐसे डेटाबेस तक पहुँच प्राप्त होगी जो सादे md5-hashes को स्टोर करता है, तो आपके लिए व्यवस्थापक के लिए हैश को इस तरह की सेवा में प्रवेश करना और लॉग इन करना होगा। लेकिन, यदि पासवर्ड नमकीन थे, तो ऐसी सेवा बन जाएगी। अप्रभावी।

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


लक्ष्य साइट में कुछ भी संवेदनशील नहीं होना चाहिए (यह बैंक नहीं है), लेकिन फिर भी मैं इसे सुरक्षित रखूंगा।
लुइसुबल

1
डबल हैशिंग परिणाम स्थान को कम नहीं करता है। डिक्शनरी हैशिंग डिक्शनरी और ब्रूट फ़ोर्स अटैक के खिलाफ एक सामान्य नियंत्रण है (यह उन्हें बहुत धीमा कर देता है जितना कि यह आपके कंप्यूटर की जाँच को धीमा कर देता है)।
फ्रैंककोडियर

2
@frankodwyer: हां, यह बुरा है। sha1(sha1($foo))प्रभावी रूप से आउटपुट स्पेस को कम कर देता है, क्योंकि आंतरिक फ़ंक्शन की कोई भी टक्कर स्वचालित रूप से बाहरी की टक्कर बन जाएगी। गिरावट रेखीय है, लेकिन यह अभी भी एक चिंता का विषय है। पुनरावृत्त हैशिंग विधियाँ प्रत्येक दौर पर डेटा वापस भेजती हैं, जैसे कि $hash = sha1(sha1($salt . $password) . $salt)। लेकिन यह अभी भी अच्छा नहीं है ... PBKDF2 या Bcrypt के साथ छड़ी ...
ircmaxell

-7

ठीक है फिट में हम नमक नमक अद्वितीय होना चाहिए ताकि इसे उत्पन्न करते हैं

   /**
     * Generating string
     * @param $size
     * @return string
     */
    function Uniwur_string($size){
        $text = md5(uniqid(rand(), TRUE));
        RETURN substr($text, 0, $size);
    }

इसके अलावा, हमें sha512 का उपयोग करते हुए हैश I`m की आवश्यकता है यह सबसे अच्छा है और यह php में है

   /**
     * Hashing string
     * @param $string
     * @return string
     */
    function hash($string){
        return hash('sha512', $string);
    }

इसलिए अब हम सुरक्षित पासवर्ड बनाने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं

// generating unique password
$password = Uniwur_string(20); // or you can add manual password
// generating 32 character salt
$salt = Uniwur_string(32);
// now we can manipulate this informations

// hashin salt for safe
$hash_salt = hash($salt);
// hashing password
$hash_psw = hash($password.$hash_salt);

अब हमें डेटाबेस में अपने $ hash_psw वैरिएबल वैल्यू और $ सॉल्ट वेरिएबल को सेव करना होगा

और अधिकृत करने के लिए हम उसी चरणों का उपयोग करेंगे ...

यह हमारे ग्राहकों के पासवर्ड को सुरक्षित करने का सबसे अच्छा तरीका है ...

Ps पिछले 2 चरणों के लिए आप अपने स्वयं के एल्गोरिथ्म का उपयोग कर सकते हैं ... लेकिन सुनिश्चित करें कि आप भविष्य में इस हैशेड पासवर्ड को उत्पन्न कर सकते हैं जब आपको उपयोगकर्ता को अधिकृत करने की आवश्यकता हो ...


4
यह सवाल पासवर्ड के लिए हैश के बारे में था। sha512पासवर्ड के संरक्षण के लिए 1 निष्पादन (भले ही नमकीन) व्यापक रूप से अच्छा नहीं माना जाता है। (यह भी कि RNG क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है, इसलिए पासवर्ड पीढ़ी के लिए इसका उपयोग करना जोखिम भरा है)।
13

2
आपको पता नहीं है कि आप क्या कर रहे हैं। इस पोस्ट में शीर्ष उत्तर पढ़ें और आप देख सकते हैं कि आपका कोड सिर्फ असुरक्षित क्यों नहीं है, लेकिन इसका कोई मतलब नहीं है।
गुप्त

ठीक। मेरा कोड सुरक्षित नहीं है। तो मुझे बताएं कि आप अपने एल्गोरिदम में उपयोग क्यों कर रहे हैं Sha256 ??? मुझे पता है कि sha512 सबसे अच्छा है क्यों नहीं इसका उपयोग करें ???
शाल्वसॉफ्ट

1
@shalvasoft sha512 सामान्य उद्देश्य हैशिंग के लिए बहुत अच्छा है, लेकिन पासवर्ड सुरक्षा के लिए बहुत विशिष्ट गुणों के साथ हैश की आवश्यकता होती है ( उदाहरण के लिए "धीमी गति से होना अजीब बात है , और sha512 बहुत तेज़ है)।" कुछ लोगों ने पासवर्ड हैशिंग कार्यों को बनाने के लिए बिल्डिंग ब्लॉक के रूप में sha512 का उपयोग किया है, लेकिन आजकल अनुशंसित दृष्टिकोण "बीसीक्रिप्ट का उपयोग करें और स्क्रीप्ट पर नज़र रखें" है।
ल्यूकसुबल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.