2011-08-15 20 views
7

संभव डुप्लिकेट:
Secure hash and salt for PHP passwordsअच्छा क्रिप्टोग्राफिक हैश कार्यों

मैं एक वेबसाइट बना रही हूँ, और मैं एक सुरक्षित एल्गोरिथ्म की जरूरत पासवर्ड स्टोर करने के लिए। मैं पहली बार bcrypt के बारे में सोच रहा था, लेकिन फिर मुझे पता चला कि मेरे मेजबान ने इसका समर्थन नहीं किया है और मैं मेजबान को बदलने में सक्षम नहीं हूं। ,

  • MD5
  • MD2, MD4 & md5
  • SHA1, SHA256:

    • स्टैंडर्ड डेस

    और इन हैश:

    मेरे मेजबान इस एन्क्रिप्शन की अनुमति देते हैं sha384 & SHA512

  • ripemd128, ripemd160, ripemd256 और ripemd360
  • भँवर
  • tiger128,3, tiger160,3, tiger192,3, tiger128,4, tiger160,4 & tiger192,4
  • snefru
  • GOST
  • Adler32
  • CRC32 & crc32b
  • haval128,3, haval160,3, haval192,3, haval224,3, haval256,3, haval128,4, haval160,4, haval192 , 4, haval224,3, haval256,4, haval128,5, haval160,5, haval192,5, haval224,5 & haval256,5

तो, आप में से किसी कि और एक के साथ एक अच्छा एल्गोरिथ्म ठीक कर सकते हैं नमक, कृपया?

+2

आप क्या चाहते हैं? एन्क्रिप्टिंग या हैशिंग? इसके अलावा, एमडी 5 एक हैश है, एन्क्रिप्शन नहीं। – gnur

+0

http://stackoverflow.com/search?q=php+store+passwords देखें, यह अच्छी जानकारी –

+2

है [यह उत्तर] पढ़ें [http://stackoverflow.com/questions/4948322/fundamental-difference- बीच-हैशिंग और एन्क्रिप्शन एल्गोरिदम/4948393 # 4948393)। Sha256 या sha512 का प्रयोग करें, पुनरावृत्त, और इसके साथ किया जाना चाहिए ... – ircmaxell

उत्तर

8

आपको एन्क्रिप्टेड (या यहां तक ​​कि अनएन्क्रिप्टेड) ​​पासवर्ड भी स्टोर नहीं करना चाहिए। इसके बजाय, salted hashes का उपयोग करें (विस्तारित, उदाहरण के साथ PBKDF2), अधिमानतः SHA2-512। (हैश समारोह नहीं)

एन्क्रिप्शन: डेस
गैर क्रिप्टोग्राफिक चेकसम (हास्यास्पद):

संदर्भ के लिए, यहाँ सूचीबद्ध हैश की एक वर्गीकरण (विवरण के लिए wikipedia देखें) Adler32 , CRC32, crc32b
टूटी: MD2, MD4, MD5, SHA1
शायद टूट: टाइगर, snefru, GOST, Haval *
शायद सुरक्षित: SHA2-256/384/512, RIPEMD-128/256, RIPEMD-160/320, WHIRLPOOL

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

+0

प्रश्न में हैशिंग और नमक दोनों का उल्लेख है ... – geoffspear

+0

कभी-कभी एन्क्रिप्टेड पासवर्ड को स्टोर करना आवश्यक है ताकि बाहरी पर लॉग इन कर सकें सिस्टम। – rossum

+0

@rossum इन मामलों में, आपको एकल-साइन ऑन समाधान का उपयोग करना चाहिए। समझौता सिस्टम डेटा के मामले में हमलावरों को लॉग इन करने से रोकने के लिए आप सादे टेक्स्ट में पासवर्ड स्टोर नहीं करते हैं। चूंकि एन्क्रिप्शन कुंजी सिस्टम के डेटा का हिस्सा है, इसलिए एन्क्रिप्टिंग आम तौर पर व्यर्थ है, जब तक कि कुंजी और डेटा अलग-अलग सुरक्षा डोमेन में न हों। – phihag

1

crc32, adler32 इत्यादि क्रिप्टोग्राफ़िक रूप से सुरक्षित होने के लिए डिज़ाइन नहीं किए गए हैं - वे केवल तेज़ चेकसम एल्गोरिदम हैं। मुझे लगता है कि नमकीन एसएचए -256 को सुरक्षा और संगतता का एक अच्छा संयोजन प्रदान करना चाहिए।

कुछ हद तक कम गंभीर नोट पर, मुझे एक बार धीमे सर्वर पर नमकीन एमडी 5 का उपयोग करने की याद आती है, जिसे मध्यम भार को टैंक करने की उम्मीद थी। तो मैंने इसे 32-बिट यादृच्छिक नमक के साथ पैड करने का फैसला किया, और पूरी चीज को हेक्साडेसिमल के रूप में संग्रहीत किया - इसने इंप्रेशन को छोड़ दिया कि पूरी चीज को अनचाहे SHA-1 था। मैं ईमानदारी से आशा करता हूं कि किसी ने चुराए गए डंप पर इंद्रधनुष सारणी चलाने के लिए अनमोल समय बर्बाद कर दिया!

सुरक्षा वास्तव में सब के बारे में नहीं और अधिक महंगी हैशिंग :)

+0

अस्पष्टता के माध्यम से सुरक्षा (जो वास्तव में पैडिंग विधि है) सुरक्षा नहीं है। यह आपको रात में बेहतर महसूस कर सकता है, लेकिन अंत में यह वास्तव में इसे और अधिक सुरक्षित नहीं बना रहा है। और जब आप जोड़े को तोड़ने की अवधारणा के साथ (और यह होगा, इसमें केवल समय लगता है), आसान हैश के कारण हर किसी का पासवर्ड बलपूर्वक आसान होगा। और अधिकांश कार्यान्वयन में, एमडी 5 वास्तव में या तो sha1 या sha256 से धीमा है ... इसलिए मुझे नहीं पता कि आप क्या हासिल करने की कोशिश कर रहे हैं (और आप इसे लंबे शॉट से चूक गए हैं) ... – ircmaxell

1

आप

  • अपने हैश के भाग के रूप में एक नमक का प्रयोग करना चाहिए।
  • 10,000+ पुनरावृत्ति सीमा में पुनरावृत्त दिनचर्या का उपयोग करें। उदाहरण के लिए, पीबीकेडीएफ # 2।
  • gnur के रूप में कहा एक ज्ञात मजबूत हैश (SHA-256, SHA-512)
0

का प्रयोग करें, यदि आप हैश या पासवर्ड एन्क्रिप्ट करना चाहते हैं तय करने के लिए की जरूरत है। यदि ये आपके अपने उपयोगकर्ताओं के लिए पासवर्ड हैं और पासवर्ड केवल आपके सिस्टम पर उपयोग किए जा रहे हैं, तो उन्हें नमक और खींचने का उपयोग करके हैश करें। हैश एल्गोरिदम में से आप SHA-256 या SHA-512 का उपयोग कर सकते हैं। नमक के लिए 128 यादृच्छिक बिट्स (16 बाइट्स) का उपयोग करें। आदर्श रूप से एक क्रिप्टोग्राफिक आरएनजी का उपयोग करें हालांकि एक गैर-क्रिप्टो आरएनजी चुटकी में करेगा। हमलावर को वैसे भी लवण पता है माना जाता है। एक पासवर्ड को संसाधित करने में काफी 0.1 सेकंड लगते हैं। यह किसी भी हमलावर को हर सेकेंड में पासवर्ड तोड़ने के दस प्रयासों को सीमित करता है।

यदि आप किसी बाहरी सिस्टम पर लॉग ऑन करने के लिए पासवर्ड संग्रहीत कर रहे हैं तो आपको पासवर्ड को एन्क्रिप्ट करना होगा और आवश्यकता होने पर उन्हें डिक्रिप्ट करना होगा। डीईएस आपका एकमात्र वास्तविक विकल्प है, जब तक कि आपके पास 3DES (उर्फ ट्रिपल डीईएस या डीईएसडीई) भी उपलब्ध न हो। मुझे हैरान है कि एईएस/रिजेंडेल उपलब्ध नहीं है। यदि यह तो हमें डीईएस की वरीयता में है।

+1

डीईएस ** कभी नहीं * * इस दिन में उम्र में एक विकल्प। इसका उपयोग करना बेहतर है [रिजेंडेल (एईएस) को लागू करें] (https://github.com/ircmaxell/PHP-CryptLib/blob/master/lib/CryptLib/Cipher/Block/Cipher/Rijndael.php) PHP भूमि में उपयोग करने के बजाय डीईएस जो बहुत ही तुच्छ टूट गया है ... – ircmaxell

1

आपको ऊपर वर्णित हैंश के रूप में पासवर्ड को एन्क्रिप्टेड नहीं करना चाहिए।

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

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

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

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