2010-08-23 9 views
6

मैं अपेक्षाकृत परिपक्व ओपन-सोर्स PHP प्रोजेक्ट में योगदान दे रहा हूं। हाल ही में, मैंने पाया कि यह पासवर्ड को सादा MD5 हैश के रूप में संग्रहीत करता है, जो मेरे लिए काफी परेशान है। मैंने सोचा कि अगर मैं इसे ठीक करने जा रहा था, तो मैं भी यह सही कर सकता हूं (टीएम), इसलिए मैं bcrypt का उपयोग करना चाहता था।मैं PHP अनुप्रयोग में bcrypt को कैसे प्रबंधित कर सकता हूं (और मुझे चाहिए)?

सबसे पहले, मुझे अन्य भाषाओं के लिए क्या मिला है: bcrypt-ruby ओपनबीएसडी या jBCrypt के जावा कोड से मूल सी कोड का उपयोग करने लगता है। py-bcrypt बीएसडी कोड के चारों ओर एक पतली आवरण है। BCrypt.netjBCrypt का सीधा बंदरगाह है।

अब, PHP the crypt function में बैक्रिप्ट का समर्थन करता है (यद्यपि, भ्रामक रूप से केवल 'blowfish' कहा जाता है)। हालांकि, 5.3 से पहले के संस्करणों को सिस्टम पर ही समर्थन की आवश्यकता होती है, आमतौर पर crypt_blowfish द्वारा प्रदान की जाती है। phpass वही है, और PHP 5.3 या Suhosin स्थापित करने की अनुशंसा करता है।

चूंकि एप्लिकेशन के कई उपयोगकर्ता मानक साझा होस्टिंग का उपयोग करते हैं, इसलिए मैं सर्वर की किसी विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं चाहता हूं। मैं केवल PHP की 5.3 रिलीज से कोड चुरा रहा था, लेकिन यह सी में है, और (मैंने जो कुछ पढ़ा है, उससे अभी तक) मुझे परियोजना के उपयोगकर्ताओं के लिए सी-एक्सटेंशन के उपयोग की आवश्यकता नहीं है।

मैंने बस bcrypt का शुद्ध-PHP पोर्ट बनाने का विचार किया, लेकिन the source of jBCrypt पर देखकर, मुझे यकीन नहीं है कि मुझे यह करना चाहिए कि मुझे PHP या blowfish से अविश्वसनीय रूप से परिचित नहीं है, और यहां एक गलती हो सकती है पहली जगह में पता लगाने के लिए एक साथ खतरनाक और मुश्किल है।

तो, मैं तुम दोनों (बहुखण्डीय) प्रश्नों के मौजूद:

  1. मुझे का सबसे अच्छा हो रही पीएचपी ज्ञान की मेरी कमी है? क्या मैं वास्तव में पहले से बनाए गए कार्यान्वयन में से एक का उपयोग कर सकता हूं?
  2. क्या मुझे इसके बजाय बस एक साधारण लूपिंग फ़ंक्शन बनाना चाहिए जो sha1() या md5() को बार-बार कॉन्फ़िगर करने योग्य संख्या के लिए कॉल करता है?

उत्तर

7

पीएचपी ज्ञान की मेरी कमी मुझे का सबसे अच्छा हो रही है? क्या मैं वास्तव में पहले से बनाए गए कार्यान्वयन में से एक का उपयोग कर सकता हूं?

दुर्भाग्यवश, आप सही हैं। 5.3.0 से पहले PHP डिफ़ॉल्ट रूप से bcrypt का समर्थन नहीं करता था। इसके बजाए, यह ओएस के समर्थन पर निर्भर था (CRYPT_BLOWFISH निरंतर जांचें)। जैसा कि आपने बताया है कि Suhosin उस मामले में एक विकल्प है।

क्या मुझे इसके बजाय बस एक साधारण लूपिंग फ़ंक्शन बनाना चाहिए जो कुछ कॉन्फ़िगर करने योग्य संख्या के लिए sha1() या md5() को बार-बार कॉल करता है?

क्रिप्टोग्राफी की बात आने पर सबसे अच्छी सलाह है "अपना खुद का रोल न करें।" sha1() या md5()पर दोहराए गए कॉल सुरक्षा बढ़ा सकते हैं या नहीं।

दूसरी तरफ bcrypt के लेखक this paper पर अपने डिजाइन निर्णयों की व्याख्या करते हैं।

+0

+1। हैश हमेशा इस्तेमाल किया जाना चाहिए। – rook

+11

हालांकि bcrypt वास्तव में एक ब्लॉक सिफर से निर्मित एक हैश फ़ंक्शन है ... – rook

+0

शून्य, क्या आपके पास नीचे दिए गए मुद्दे पर फेंकने के लिए कोई संसाधन है? –

1

दुर्भाग्य से आप ब्लॉफिश के साथ bcrypt का उपयोग नहीं कर सकते हैं जब तक कि आप PHP 5.3 पर नहीं हैं या Suhosin एक्सटेंशन का उपयोग कर रहे हैं या संभवतः ऑपरेटिंग सिस्टम को अपने bcrypt कार्यान्वयन में Blowfish के लिए समर्थन है।

तो इस मामले में आपकी सबसे अच्छी शर्त key stretching (और निश्चित रूप से, नमक) के साथ SHA-256 या SHA-512 का उपयोग करना होगा। लेकिन जब सुरक्षा की बात आती है तो अपना खुद का समाधान रोल करना कभी अच्छा विचार नहीं होता है।

1

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

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

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