दिलचस्प पोस्ट
कैसे जाँचने के लिए कि एक स्ट्रिंग नियमित अभिव्यक्ति का उपयोग कर एक palindrome है? रनटाइम पर कक्षा परिभाषा की एनोटेशन स्ट्रिंग पैरामीटर को संशोधित करें एक फ़ाइल में डुप्लिकेट लाइनें ढूंढें और गणना करें कि प्रत्येक पंक्ति को कितनी बार डुप्लिकेट किया गया था? अहस्ताक्षरित पूर्णांक ओवरफ़्लो परिभाषित व्यवहार क्यों नहीं है, पर हस्ताक्षर किए पूर्णांक अतिप्रवाह है? एक asp.net वेब सेवा को कॉल करने के लिए jQuery का उपयोग कैसे करें? C ++ फ़ंक्शन पॉइंटर प्रकार के रूप में कक्षा विधि का उपयोग करना ASP.NET MVC में बटन क्लिक करने पर आंशिक दृश्य प्रस्तुत करना नियंत्रण के पुनर्निर्माण के बिना select2 डेटा अपडेट करें निष्पादन योग्य से विंडोज सेवा बनाएँ मार्कडाउन और एकाधिक फ़ाइलों सहित त्रुटि: allowDefinition = 'MachineToApplication' अनुप्रयोग स्तर से परे .each () के पूरा होने के बाद एक jQuery फ़ंक्शन को शामिल करना सार वर्ग बनाम इंटरफेस JAR.lang.ClassNotFoundException का सामना किए बिना कैसे युद्ध परियोजना में JAR पुस्तकालयों को जोड़ने के लिए? क्लासपाथ बनाम बिल्ड पाथ बनाम / वेब-एनएफ़ / लिब निष्क्रिय यूनियन सदस्य और अपरिभाषित व्यवहार तक पहुंच?

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

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

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

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

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

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

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

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

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

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

अस्वीकरण : यह उत्तर 2008 में लिखा गया था।

तब से, PHP ने हमें password_hash और password_verify दिया है और, उनके परिचय के बाद से, वे अनुशंसित पासवर्ड हैशिंग और चेकिंग विधि हैं।

उत्तर का सिद्धांत अभी भी एक अच्छा पढ़ा है।

टी एल; डॉ

क्या न करें

  • उपयोगकर्ताओं को पासवर्ड के लिए कौन-से वर्ण दर्ज कर सकते हैं, यह सीमित न करें। केवल बेवकूफ यह करते हैं
  • किसी पासवर्ड की लंबाई को सीमित मत करें। यदि आपके उपयोगकर्ता में सुपरलिप्रैगिलिस्टिक्स एक्सपीआईड्यूसिजियस के साथ एक वाक्य चाहते हैं, तो इसे प्रयोग करने से रोकें न।
  • अपने उपयोगकर्ता के पासवर्ड को सादे-पाठ में कभी नहीं रखें
  • कभी भी अपने उपयोगकर्ता को पासवर्ड को ईमेल करें , जब उन्हें अपना खो दिया हो, और आपने एक अस्थायी एक भेजा।
  • कभी भी, कभी भी किसी भी तरीके से पासवर्ड लॉग इन करें
  • SHA1 या MD5 या SHA256 के साथ हैश पासवर्ड कभी नहीं! आधुनिक पटाखे 60 और 180 अरब हैश / दूसरे (क्रमशः) से अधिक हो सकते हैं।
  • बीक्रीप्प्ट और हैश () के कच्चे आउटपुट के साथ मिश्रण न करें, या तो हेक्स आउटपुट या बेस 64_एएनोड का प्रयोग करें। (यह किसी भी इनपुट पर लागू होता है जिसमें इसमें एक दुष्ट \0 हो सकता है, जो सुरक्षा को गंभीरता से कमजोर कर सकता है।)

डॉस

  • जब आप कर सकते हैं, तब स्क्रिप्प का उपयोग करें; bcrypt यदि आप नहीं कर सकते
  • पीबीकेडीएफ 2 का प्रयोग करें यदि आप एसबीए 2 हैश के साथ या तो बीक्रिप्ट या स्क्रीप्ट का उपयोग नहीं कर सकते हैं
  • डेटाबेस के साथ समझौता होने पर प्रत्येक के पासवर्ड रीसेट करें
  • उचित 8-10 वर्ण न्यूनतम लंबाई को लागू करें, साथ ही कम से कम 1 ऊपरी केस पत्र, 1 लोअर केस लेटर, एक नंबर और एक प्रतीक की आवश्यकता होगी। इससे पासवर्ड की एन्ट्रपी में सुधार होगा, बदले में यह दरार करने के लिए कठिन होता है (कुछ बहस के लिए "क्या अच्छा पासवर्ड बनाता है?" अनुभाग देखें।)

क्यों हैश पासवर्ड वैसे भी?

हैशिंग पासवर्ड के पीछे का उद्देश्य सरल है: डेटाबेस से समझौता करके उपयोगकर्ता खातों पर दुर्भावनापूर्ण पहुंच को रोकना। तो पासवर्ड हैशिंग का लक्ष्य सादे टेक्स्ट पासवर्ड की गणना करने के लिए उन्हें बहुत अधिक समय या पैसा खर्च करके हैकर या क्रैकर को रोकना है। और समय / लागत आपके शस्त्रागार में सबसे अच्छा बाधाएं हैं

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

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

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

(जोर मेरा।)

वैसे भी एक अच्छा पासवर्ड क्या है?

एंट्रोपी (ऐसा नहीं है कि मैं पूरी तरह से रान्डेल के दृष्टिकोण की सदस्यता लेता हूं।)

संक्षेप में, एन्ट्रापी कितनी भिन्नता पासवर्ड के भीतर है जब एक पासवर्ड केवल लोअरकेस रोमन अक्षर होता है, तो केवल 26 वर्ण होते हैं। यह बहुत भिन्नता नहीं है अल्फ़ा-न्यूमेरिक पासवर्ड 36 वर्णों के साथ बेहतर हैं लेकिन ऊपरी और निचले मामले को प्रतीकों के साथ, लगभग 96 अक्षर हैं। यह सिर्फ अक्षरों से बहुत बेहतर है एक समस्या यह है कि हमारे पासवर्ड यादगार बनाने के लिए हम पैटर्न को सम्मिलित करते हैं- जो कि एन्ट्रपी कम कर देता है। ऊप्स!

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

क्रिप्टो स्टैक एक्सचेंज साइट पर पासवर्ड एंटरपीपी की लंबी चर्चा है एक अच्छी Google खोज में बहुत सारे परिणाम भी होंगे I

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

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

सर्वोत्तम प्रथाएं

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

मैं क्रिप्ट फ़ंक्शन के लिए दस्तावेज़ को पढ़ने का सुझाव दे रहा हूं यदि आप समझना चाहते हैं कि बीसीआरपीटी का इस्तेमाल कैसे करना है, या खुद को एक अच्छा आवरण ढूंढने या किसी अधिक लीगेसी कार्यान्वयन के लिए PHPASS जैसे कुछ का उपयोग करना मैं कम से कम 12 राउंड बीक्रिप्ट की सिफारिश करता हूं, यदि नहीं 15 से 18

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

औसत अभ्यास

मैं लगभग अब इस स्थिति की कल्पना नहीं कर सकता। PHPASS PHP 3.0.18 के माध्यम से 5.3 का समर्थन करता है, इसलिए यह लगभग हर अधिष्ठापन पर कल्पना योग्य है- और इसका उपयोग किया जाना चाहिए यदि आप कुछ के लिए नहीं जानते हैं कि आपका वातावरण bcrypt का समर्थन करता है

लेकिन लगता है कि आप bcrypt या PHPASS बिल्कुल भी नहीं उपयोग कर सकते हैं। फिर क्या?

पीडीकेबीएफ 2 के कार्यान्वयन की अधिकतम संख्या के साथ राउंड की कोशिश करें, जो आपके वातावरण / एप्लिकेशन / उपयोगकर्ता-धारणा को सहन कर सकते हैं। सबसे कम संख्या मैं सुझाऊंगा 2500 राउंड है साथ ही, hash_hmac () का उपयोग करना सुनिश्चित करें यदि यह ऑपरेशन को पुन: उत्पन्न करने के लिए कठिन बनाने के लिए उपलब्ध है।

भविष्य के आचरण

PHP 5.5 में आ रहा है एक पूर्ण पासवर्ड संरक्षण पुस्तकालय है जो कि बीक्रीप्पट के साथ काम करने के किसी भी दर्द को दूर करता है। हालांकि हममें से ज्यादातर PHP 5.2 और 5.3 के साथ सबसे आम वातावरण में हैं, खासकर साझा मेजबान, @आईआरसीएमएक्सल ने आने वाले एपीआई के लिए एक संगतता परत बनाया है जो PHP 5.3.7 के लिए पिछड़े संगत है।

क्रिप्टोग्राफी रीकैप और अस्वीकरण

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

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

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

एक बहुत कम और सुरक्षित उत्तर – अपना पासवर्ड तंत्र बिल्कुल भी नहीं लिखें , एक परीक्षण और परीक्षण तंत्र का उपयोग करें

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

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

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

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

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

यह भी देखें:

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

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

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

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

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

PHP 5.5 के रूप में, PHP, हैशिंग और पासवर्ड की पुष्टि करने के लिए सरल, सुरक्षित कार्य है password_hash () और password_verify ()

 $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() का उपयोग किया जाता है, यह एक यादृच्छिक नमक उत्पन्न करता है और इसमें आउटपुट किए गए हैश में (लागत और एल्गोरिथ्म के साथ प्रयोग किया जाता है।) पासवर्ड_verify password_verify() तब उस हैश पढ़ता है और नमक और एन्क्रिप्शन पद्धति का इस्तेमाल करता है, और इसके खिलाफ पुष्टि करता है प्रदान किए गए सादा पाठ पासवर्ड

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सर्वर

बंदरगाहों

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

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

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

पारण शब्द

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

डेटाबेस

सर्वर

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

उपयोगकर्ता

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

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

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

पारण शब्द

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

पीएचपी

पारण शब्द

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

हैशिंग

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

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

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

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

रेह

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

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

पासवर्ड बनाने वाले उपयोगकर्ता

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

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

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

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

http://git.io/mSJqpw

गूगल कहते हैं कि SHA256 PHP के लिए उपलब्ध है

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

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

इस मामले पर मुझे सही विषय मिलाः 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)); } ?> 

I usually use SHA1 and salt with the user ID (or some other user-specific piece of information), and sometimes I additionally use a constant salt (so I have 2 parts to the salt).

SHA1 is now also considered somewhat compromised, but to a far lesser degree than MD5. By using a salt (any salt), you're preventing the use of a generic rainbow table to attack your hashes (some people have even had success using Google as a sort of rainbow table by searching for the hash). An attacker could conceivably generate a rainbow table using your salt, so that's why you should include a user-specific salt. That way, they will have to generate a rainbow table for each and every record in your system, not just one for your entire system! With that type of salting, even MD5 is decently secure.

SHA1 and a salt should suffice (depending, naturally, on whether you are coding something for Fort Knox or a login system for your shopping list) for the foreseeable future. If SHA1 isn't good enough for you, use SHA256 .

The idea of a salt is to throw the hashing results off balance, so to say. It is known, for example, that the MD5-hash of an empty string is d41d8cd98f00b204e9800998ecf8427e . So, if someone with good enough a memory would see that hash and know that it's the hash of an empty string. But if the string is salted (say, with the string " MY_PERSONAL_SALT "), the hash for the 'empty string' (ie " MY_PERSONAL_SALT ") becomes aeac2612626724592271634fb14d3ea6 , hence non-obvious to backtrace. What I'm trying to say, that it's better to use any salt, than not to. Therefore, it's not too much of an importance to know which salt to use.

There are actually websites that do just this – you can feed it a (md5) hash, and it spits out a known plaintext that generates that particular hash. If you would get access to a database that stores plain md5-hashes, it would be trivial for you to enter the hash for the admin to such a service, and log in. But, if the passwords were salted, such a service would become ineffective.

Also, double-hashing is generally regarded as bad method, because it diminishes the result space. All popular hashes are fixed-length. Thus, you can have only a finite values of this fixed length, and the results become less varied. This could be regarded as another form of salting, but I wouldn't recommend it.

ok in the fitsy we need salt salt must be unique so let generate it

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

also we need the hash I`m using sha512 it is the best and it is in php

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

so now we can use this functions to generate safe password

 // 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); 

now we need to save in database our $hash_psw variable value and $salt variable

and for authorize we will use same steps…

it is the best way to safe our clients passwords…

Ps for last 2 steps you can use your own algorithm… but be sure that you can generate this hashed password in the future when you need to authorize user…