आपको पासवर्ड पर किसी भी अन्य सफाई तंत्र से बचना, ट्रिम या उपयोग नहीं करना चाहिए। आप password_hash()
कई कारणों से PHP के साथ हैशिंग होंगे , इसका सबसे बड़ा कारण यह है कि पासवर्ड की अतिरिक्त सफाई करने के लिए अनावश्यक अतिरिक्त कोड की आवश्यकता होती है।
आप तर्क करेंगे (और आप इसे हर उस पोस्ट में देखेंगे जहां उपयोगकर्ता डेटा आपके सिस्टम में उपयोग के लिए स्वीकार किया जाता है) जिसे हमें सभी उपयोगकर्ता इनपुट को साफ करना चाहिए और आप हमारे उपयोगकर्ताओं से स्वीकार किए जाने वाले प्रत्येक जानकारी के लिए सही होंगे। पासवर्ड अलग हैं। हशेड पासवर्ड किसी भी SQL इंजेक्शन खतरे की पेशकश नहीं कर सकते क्योंकि डेटाबेस में स्टोर करने से पहले स्ट्रिंग को हैश में बदल दिया जाता है।
पासवर्ड हैशिंग का कार्य आपके डेटाबेस में स्टोर करने के लिए पासवर्ड को सुरक्षित बनाने का कार्य है। हैश फ़ंक्शन किसी भी बाइट को विशेष अर्थ नहीं देता है, इसलिए सुरक्षा कारणों से इसके इनपुट की कोई सफाई आवश्यक नहीं है
यदि आप उपयोगकर्ताओं को उन पासवर्डों / वाक्यांशों का उपयोग करने की अनुमति देने के मंत्रों का पालन करते हैं जो वे चाहते हैं और आप पासवर्डों को सीमित नहीं करते हैं , तो किसी भी लम्बाई, किसी भी स्थान और किसी भी विशेष वर्ण हैशिंग की अनुमति देता है पासवर्ड / पासफ़्रेज़ को सुरक्षित रखता है कोई फर्क नहीं पड़ता कि क्या भीतर निहित है पासवर्ड। अभी सबसे सामान्य हैश (डिफ़ॉल्ट) के रूप में, PASSWORD_BCRYPT
पासवर्ड को 60 कैरेक्टर के चौड़े स्ट्रिंग में बदल देता है जिसमें रैंडम सॉल्ट के साथ-साथ हैशेड पासवर्ड की जानकारी और एक कॉस्ट (हैश बनाने की एल्गोरिदमिक लागत) शामिल है:
PASSWORD_BCRYPT का उपयोग CRYPT_BLOWFISH एल्गोरिथ्म का उपयोग करके नया पासवर्ड हैश बनाने के लिए किया जाता है। यह हमेशा "$ 2y $" क्रिप्ट प्रारूप का उपयोग करके एक हैश में होगा, जो हमेशा 60 वर्ण चौड़ा होता है।
हैश को संचय करने के लिए स्थान की आवश्यकताएं परिवर्तन के अधीन हैं क्योंकि विभिन्न हैशिंग विधियों को फ़ंक्शन में जोड़ा जाता है, इसलिए संग्रहीत हैश के लिए स्तंभ प्रकार पर बड़ा जाना हमेशा बेहतर होता है, जैसे कि VARCHAR(255)
या TEXT
।
आप अपने पासवर्ड के रूप में एक पूरी SQL क्वेरी का उपयोग कर सकते हैं और इसे हैश किया जाएगा, जिससे यह SQL इंजन द्वारा अप्राप्य हो जाएगा, जैसे
SELECT * FROM `users`;
को हैशड किया जा सकता है $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
आइए देखें कि अलग-अलग सैनिटाइज़िंग तरीके पासवर्ड को कैसे प्रभावित करते हैं -
पासवर्ड है I'm a "dessert topping" & a <floor wax>!
( के अंत में 5 स्थान हैं जो यहां प्रदर्शित नहीं हैं।)
जब हम ट्रिमिंग के निम्नलिखित तरीकों को लागू करते हैं तो हमें कुछ अलग-अलग परिणाम मिलते हैं:
var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));
परिणाम:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been added
string(34) "I'm a "dessert topping" & a ! " // looks like we have something missing
जब हम इन्हें भेजते हैं तो क्या होता है password_hash()
? वे सभी हैशेड हो गए, जैसे ऊपर क्वेरी ने किया था। समस्या तब आती है जब आप पासवर्ड को सत्यापित करने का प्रयास करते हैं। यदि हम इनमें से एक या एक से अधिक विधियों को नियोजित करते हैं तो हमें उनकी तुलना करने से पहले उन्हें पुनः नियोजित करना होगा password_verify()
। निम्नलिखित विफल होगा:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
आपको पासवर्ड सत्यापन में उस के परिणाम का उपयोग करने से पहले आपके द्वारा चुने गए सफाई विधि के माध्यम से पोस्ट किए गए पासवर्ड को चलाना होगा। यह कदमों का एक अनावश्यक सेट है और हैश को बेहतर नहीं बनाएगा।
5.5 से कम PHP संस्करण का उपयोग करना? आप password_hash()
संगतता पैक का उपयोग कर सकते हैं ।
आपको वास्तव में MD5 पासवर्ड हैश का उपयोग नहीं करना चाहिए ।