PHP में हैशिंग पासवर्ड के लिए आप bcrypt का उपयोग कैसे करते हैं?




passwords cryptography (6)

हर अब और फिर मैं सलाह सुनता हूं "PHP में पासवर्ड संग्रहीत करने के लिए bcrypt का उपयोग करें, bcrypt नियम"।

लेकिन bcrypt क्या है? PHP किसी भी ऐसे फ़ंक्शन की पेशकश नहीं करता है, एक फ़ाइल-एन्क्रिप्शन उपयोगिता और वेब खोजों के बारे में विकिपीडिया बब्बल अलग-अलग भाषाओं में Blowfish कुछ कार्यान्वयन को प्रकट करता है। अब Blowfish PHP में mcrypt माध्यम से भी उपलब्ध है, लेकिन यह पासवर्ड संग्रहीत करने में कैसे मदद करता है? Blowfish एक सामान्य उद्देश्य सिफर है, यह दो तरीकों से काम करता है। अगर इसे एन्क्रिप्ट किया जा सकता है, तो इसे डिक्रिप्ट किया जा सकता है। पासवर्ड को एक तरफा हैशिंग फ़ंक्शन की आवश्यकता होती है।

स्पष्टीकरण क्या है?


PHP के संस्करण 5.5 में BCrypt के लिए अंतर्निहित समर्थन होगा, फ़ंक्शंस password_hash() और password_verify() । दरअसल ये फ़ंक्शन crypt() आस-पास केवल रैपर होते हैं, और इसे सही तरीके से उपयोग करना आसान बना देंगे। यह एक सुरक्षित यादृच्छिक नमक की पीढ़ी का ख्याल रखता है, और अच्छे डिफ़ॉल्ट मान प्रदान करता है।

इस कार्यों का उपयोग करने का सबसे आसान तरीका यह होगा:

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

यह कोड बीसीआरपीटी (एल्गोरिदम 2y ) के साथ पासवर्ड हैश, ओएस यादृच्छिक स्रोत से यादृच्छिक नमक उत्पन्न करता है, और डिफ़ॉल्ट लागत पैरामीटर का उपयोग करता है (फिलहाल यह 10 है)। दूसरी पंक्ति जांचती है, यदि उपयोगकर्ता दर्ज पासवर्ड पहले से संग्रहीत हैश-वैल्यू से मेल खाता है।

यदि आप लागत पैरामीटर को बदलना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं, लागत पैरामीटर 1 से बढ़ाकर, हैश मान की गणना करने के लिए आवश्यक समय को दोगुना कर सकते हैं:

$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

"cost" पैरामीटर के विपरीत, "salt" पैरामीटर को छोड़ना सबसे अच्छा है, क्योंकि फ़ंक्शन पहले से ही क्रिप्टोग्राफ़िक रूप से सुरक्षित नमक बनाने के लिए सर्वोत्तम होता है।

PHP संस्करण 5.3.7 और उसके बाद, एक ही लेखक से एक संगतता पैक मौजूद है जिसने password_hash() फ़ंक्शन बनाया है। 5.3.7 से पहले PHP संस्करणों के लिए crypt() के लिए 2y साथ कोई समर्थन नहीं है, यूनिकोड सुरक्षित बीसीक्रिप्ट एल्गोरिदम सुरक्षित है। कोई इसे 2a साथ प्रतिस्थापित कर सकता है, जो पहले के PHP संस्करणों के लिए सबसे अच्छा विकल्प है।


आप PHP के crypt() फ़ंक्शन का उपयोग करके bprypt के साथ एक-तरफा हैश बना सकते हैं और उचित ब्लॉफिश नमक में गुजर सकते हैं। पूरे समीकरण का सबसे महत्वपूर्ण यह है कि ए) एल्गोरिदम से समझौता नहीं किया गया है और बी) आप प्रत्येक पासवर्ड को सही ढंग से नमक करते हैं । आवेदन-व्यापी नमक का प्रयोग न करें; जो आपके पूरे एप्लिकेशन को इंद्रधनुष तालिकाओं के एक सेट से हमला करने के लिए खोलता है।

PHP - क्रिप्ट फ़ंक्शन


एक विकल्प है स्क्रिप का उपयोग करना, विशेष रूप से अपने पेपर में कॉलिन पेर्सिवल द्वारा बीक्रिप्ट से बेहतर होने के लिए डिज़ाइन किया गया है। पीईसीएल में एक स्क्रिप PHP एक्सटेंशन है । आदर्श रूप से यह एल्गोरिदम PHP में घुमाया जाएगा ताकि इसे पासवर्ड_ * फ़ंक्शंस (आदर्श रूप से "PASSWORD_SCRYPT") के लिए निर्दिष्ट किया जा सके, लेकिन यह अभी तक नहीं है।


तो, आप bcrypt का उपयोग करना चाहते हैं? बहुत बढ़िया! हालांकि, क्रिप्टोग्राफी के अन्य क्षेत्रों की तरह, आपको इसे स्वयं नहीं करना चाहिए। यदि आपको प्रबंधन कुंजी जैसे कुछ भी, या लवण संग्रहीत करने या यादृच्छिक संख्याएं उत्पन्न करने की आवश्यकता है, तो आप इसे गलत कर रहे हैं।

कारण सरल है: यह bcrypt को पेंच करने के लिए बहुत ही आसान है। वास्तव में, यदि आप इस पृष्ठ पर कोड के लगभग हर टुकड़े को देखते हैं, तो आप देखेंगे कि यह कम से कम इन समस्याओं में से एक का उल्लंघन कर रहा है।

चेहरा यह, क्रिप्टोग्राफी मुश्किल है।

विशेषज्ञों के लिए इसे छोड़ दें। इसे उन लोगों के लिए छोड़ दें जो नौकरी करते हैं, इन पुस्तकालयों को बनाए रखना है। अगर आपको निर्णय लेने की ज़रूरत है, तो आप इसे गलत कर रहे हैं।

इसके बजाय, बस एक पुस्तकालय का उपयोग करें। आपकी आवश्यकताओं के आधार पर कई मौजूद हैं।

पुस्तकालय

यहां कुछ अधिक सामान्य एपीआई का टूटना है।

PHP 5.5 एपीआई - (5.3.7+ के लिए उपलब्ध)

PHP 5.5 में शुरू करना, हैशिंग पासवर्ड के लिए एक नया एपीआई पेश किया जा रहा है। 5.3.7+ के लिए बनाए गए एक शिम संगतता लाइब्रेरी (मेरे द्वारा) भी है। कार्यान्वयन का उपयोग करने के लिए एक सहकर्मी-समीक्षा और सरल होने का इसका लाभ है।

function register($username, $password) {
    $hash = password_hash($password, PASSWORD_BCRYPT);
    save($username, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    if (password_verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

वास्तव में, इसका लक्ष्य बेहद सरल होना है।

संसाधन:

ज़ेंड \ क्रिप्ट \ पासवर्ड \ Bcrypt (5.3.2+)

यह एक और एपीआई है जो PHP 5.5 के समान है, और इसी तरह का उद्देश्य करता है।

function register($username, $password) {
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    $hash = $bcrypt->create($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    if ($bcrypt->verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

संसाधन:

PasswordLib

यह पासवर्ड हैशिंग के लिए थोड़ा अलग दृष्टिकोण है। बस bcrypt का समर्थन करने के बजाय, पासवर्डलिब बड़ी संख्या में हैशिंग एल्गोरिदम का समर्थन करता है। यह मुख्य रूप से उन संदर्भों में उपयोगी है जहां आपको विरासत और अलग-अलग प्रणालियों के साथ संगतता का समर्थन करने की आवश्यकता है जो आपके नियंत्रण से बाहर हो सकते हैं। यह बड़ी संख्या में हैशिंग एल्गोरिदम का समर्थन करता है। और 5.3.2+ समर्थित है

function register($username, $password) {
    $lib = new PasswordLib\PasswordLib();
    $hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $lib = new PasswordLib\PasswordLib();
    if ($lib->verifyPasswordHash($password, $hash)) {
        //login
    } else {
        // failure
    }
}

संदर्भ:

  • स्रोत कोड / दस्तावेज़ीकरण: GitHub

PHPass

यह एक परत है जो bcrypt का समर्थन करता है, लेकिन एक मजबूत मजबूत एल्गोरिदम का भी समर्थन करता है जो उपयोगी है यदि आपके पास PHP> = 5.3.2 तक पहुंच नहीं है ... यह वास्तव में PHP 3.0+ का समर्थन करता है (हालांकि bcrypt के साथ नहीं)।

function register($username, $password) {
    $phpass = new PasswordHash(12, false);
    $hash = $phpass->HashPassword($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $phpass = new PasswordHash(12, false);
    if ($phpass->CheckPassword($password, $hash)) {
        //login
    } else {
        // failure
    }
}

साधन

नोट: PHPASS विकल्पों का उपयोग न करें जो ओपनवॉल पर होस्ट नहीं हैं, वे अलग-अलग परियोजनाएं हैं !!!

बीक्रीप्ट के बारे में

यदि आप देखते हैं, इन पुस्तकालयों में से प्रत्येक एक एकल स्ट्रिंग देता है। यही कारण है कि बीसीआरपीटी आंतरिक रूप से कैसे काम करता है। और इसके बारे में उत्तर के एक टन हैं। यहां एक चयन है जो मैंने लिखा है, कि मैं यहां कॉपी / पेस्ट नहीं करूंगा, लेकिन इससे लिंक करूँगा:

लपेटें

कई अलग-अलग विकल्प हैं। जो आप चुनते हैं वह आपके ऊपर है। हालांकि, मैं अत्यधिक अनुशंसा करता हूं कि आप उपरोक्त पुस्तकालयों में से किसी एक को अपने लिए संभालने के लिए उपयोग करें।

दोबारा, यदि आप सीधे crypt() का उपयोग कर रहे हैं, तो आप शायद कुछ गलत कर रहे हैं। यदि आपका कोड hash() (या md5() या sha1() ) का उपयोग कर रहा है, तो आप लगभग निश्चित रूप से कुछ गलत कर रहे हैं।

बस एक पुस्तकालय का उपयोग करें ...


संपादित करें: 2013.01.15 - यदि आपका सर्वर इसका समर्थन करेगा, तो इसके बजाय martinstoeckli के समाधान का उपयोग करें।

हर कोई इससे ज्यादा जटिल बनाना चाहता है। क्रिप्ट () फ़ंक्शन अधिकांश काम करता है।

function blowfishCrypt($password,$cost)
{
    $chars='./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt=sprintf('$2y$%02d$',$cost);
//For PHP < PHP 5.3.7 use this instead
//    $salt=sprintf('$2a$%02d$',$cost);
    //Create a 22 character salt -edit- 2013.01.15 - replaced rand with mt_rand
    mt_srand();
    for($i=0;$i<22;$i++) $salt.=$chars[mt_rand(0,63)];
    return crypt($password,$salt);
}

उदाहरण:

$hash=blowfishCrypt('password',10); //This creates the hash
$hash=blowfishCrypt('password',12); //This creates a more secure hash
if(crypt('password',$hash)==$hash){ /*ok*/ } //This checks a password

मुझे पता है कि यह स्पष्ट होना चाहिए, लेकिन कृपया अपने पासवर्ड के रूप में 'पासवर्ड' का प्रयोग न करें।


OAuth 2 पासवर्ड के लिए:

$bcrypt = new \Zend\Crypt\Password\Bcrypt;
$bcrypt->create("youpasswordhere", 10)




bcrypt