2009-03-15 11 views
7

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

मुझे वास्तव में 2-तरफा एन्क्रिप्शन की आवश्यकता है क्योंकि मेरा ग्राहक डीबी में जाना चाहता है और पासवर्ड बदलना चाहता है या इसे पुनर्प्राप्त करना चाहता है।

+2

ग्राहक पासवर्ड पुनर्प्राप्त क्यों करना चाहते हैं? यह आमतौर पर एक बुरा विचार है। पासवर्ड को रीसेट करने के लिए व्यवस्थापक सुविधाएं दें, और उपयोगकर्ता को मूल रूप से पता होने पर पासवर्ड बदलने की क्षमता दें। –

उत्तर

24

आपने पासवर्ड को टुकड़ों में बांटा संग्रहीत करना चाहिए (और properly salted) कर रहे हैं।

इस नियम को तोड़ने के लिए पर्याप्त दुनिया में कोई बहाना नहीं है।

वर्तमान में, crypt का उपयोग करके, CRYPT_BLOWFISH सर्वोत्तम अभ्यास है।
PHP में CRYPT_BLOWFISH Bcrypt हैश का कार्यान्वयन है। Bcrypt Blowfish ब्लॉक सिफर पर आधारित है।

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

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

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

  • में संग्रहीत किया जाता है यदि आपके ग्राहक वर्तमान पासवर्ड देखना चाहते हैं, वे भाग्य से बाहर हैं। और यह हैशिंग पासवर्ड का बिल्कुल सही बिंदु है: सिस्टम को पासवर्ड नहीं पता है, इसलिए इसे कभी भी 'देखा'/चोरी नहीं किया जा सकता है।

Jeff यह के बारे में ब्लॉग: You're Probably Storing Passwords Incorrectly

आप एक मानक पुस्तकालय का उपयोग करना चाहते हैं, तो आप पर एक नज़र ले सकता है: Portable PHP password hashing framework और आप CRYPT_BLOWFISH एल्गोरिथ्म का उपयोग सुनिश्चित करें।

(सामान्य शब्दों में, अपने डेटाबेस में रिकॉर्ड सीधे मुसीबत के लिए पूछ रहा है के साथ चारों ओर खिलवाड़।
कई बहुत अनुभवी डीबी सहित लोगों administrators- कि बाहर पाया है मुश्किल तरीके से।)

+0

मुझे लगता है कि आप पढ़ने के लिए अपना पहला कथन संपादित करना चाहते हैं: "आपको पासवर्ड धोना चाहिए" –

+0

Eeeeh, हाँ, धन्यवाद :) – Jacco

+1

क्या आपका यहां ब्लोफिश लिखना था? Blowfish == सममित कुंजी एन्क्रिप्शन, हैशिंग नहीं है। मैं दृढ़ता से एन्क्रिप्शन पर हैशिंग की सिफारिश करेंगे। – thomasrutter

7

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

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

http://phpsec.org/articles/2005/password-hashing.html

+0

Thx। मैंने अभी इस सवाल को मेरे प्रश्न में जोड़ा है - मुझे वास्तव में 2-तरफा एन्क्रिप्शन की आवश्यकता है क्योंकि मेरा ग्राहक डीबी में जाना चाहता है और पासवर्ड बदलना चाहता है या इसे पुनर्प्राप्त करना चाहता है। – Bamerza

+2

ठीक है, आप कुंजी "कृपया हैकमे" के साथ पासवर्ड भी एक्सओआर कर सकते हैं। गंभीरता से हालांकि, अपने क्लाइंट को यह विश्वास दिलाएं कि उन्हें केवल पासवर्ड रीसेट करने की आवश्यकता है - इसे पुनर्प्राप्त नहीं करें। –

+0

यह एक अच्छा जवाब है, सिवाय इसके कि मैं SHA-1 एल्गोरिदम की अनुशंसा नहीं करता, जो इसे होने से अधिक आसानी से ब्रेक करने योग्य दिखाया गया है। मैं एसएचए -256, या उस परिवार में से एक (एसएचए -384, एसएचए -512, आदि) की सिफारिश करता हूं। – thomasrutter

4

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

2 कार्यों इस लक्ष्य को पूरा करने के लिए openssl_public_encrypt() और openssl_private_decrypt()

+0

यह इस लक्ष्य को पूरा करने और कम से कम कुछ सुरक्षा रखने के लिए एकमात्र तरीका की तरह लगता है। –

+0

M_CRYPT वह लाइब्रेरी है जो डेटा एन्क्रिप्शन और डिक्रिप्शन सामग्री के लिए डिज़ाइन की गई थी, ओपनएसएसएल लाइब्रेरी गुप्त/सुरक्षित संचार के लिए उपयोग की जाती है। – Jacco

+0

यह एक उचित पर्याप्त जवाब है। मैं यह भी जोड़ूंगा कि आपको कभी भी एक ही सर्वर या किसी संबंधित सर्वर पर निजी कुंजी को स्टोर नहीं करना चाहिए। एक कुंजी के लिए एक संपूर्ण हार्ड डिस्क खोजना अपेक्षाकृत आसान है। – thomasrutter

1

या तो यह में स्टोर स्पष्ट, या पासवर्ड के हैश (यानी उलटा नहीं) स्टोर करें।

कुछ और करना - विशेष रूप से एक हार्ड-कोड वाली कुंजी के साथ सममित एन्क्रिप्शन का उपयोग करना - मूल रूप से व्यर्थ है।

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

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

संबंधित मुद्दे

 संबंधित मुद्दे