खोज…


परिचय

जैसे-जैसे अधिक सुरक्षित वेब सेवाएं सादे पाठ प्रारूप में पासवर्डों को संग्रहीत करने से बचती हैं, PHP जैसी भाषाएं अधिक सुरक्षित उद्योग मानक का समर्थन करने के लिए विभिन्न (अविवेकी) हैश फ़ंक्शन प्रदान करती हैं। यह विषय PHP के साथ उचित हैशिंग के लिए प्रलेखन प्रदान करता है।

वाक्य - विन्यास

  • string password_hash ( string $password , integer $algo [, array $options ] )
  • boolean password_verify ( string $password , string $hash )
  • boolean password_needs_rehash ( string $hash , integer $algo [, array $options ] )
  • array password_get_info ( string $hash )

टिप्पणियों

PHP 5.5 से पहले, आप password_* फ़ंक्शन प्रदान करने के लिए संगतता पैक का उपयोग कर सकते हैं। यह अत्यधिक अनुशंसा की जाती है कि यदि आप ऐसा करने में सक्षम हैं तो आप संगतता पैक का उपयोग करते हैं।

संगतता पैक के साथ या बिना, crypt() माध्यम से Bcrypt कार्यक्षमता को सही करें crypt() PHP 5.3.7+ पर निर्भर करता है अन्यथा आपको ASCII- केवल वर्ण सेट के लिए पासवर्ड प्रतिबंधित करना चाहिए

नोट: यदि आप PHP 5.5 या नीचे का उपयोग करते हैं तो आप PHP के एक असमर्थित संस्करण का उपयोग कर रहे हैं जिसे अब कोई सुरक्षा अद्यतन प्राप्त नहीं होता है। जितनी जल्दी हो सके अपडेट करें, आप बाद में अपना पासवर्ड हैश अपडेट कर सकते हैं।

एल्गोरिथम चयन

सुरक्षित एल्गोरिदम

असुरक्षित एल्गोरिदम

निम्न हैशिंग एल्गोरिदम उद्देश्य के लिए असुरक्षित या अयोग्य हैं और इसलिए इसका उपयोग नहीं किया जाना चाहिए । वे पासवर्ड हैशिंग के लिए कभी भी अनुकूल नहीं थे, क्योंकि वे धीमी गति के बजाय तेजी से पचाने के लिए डिज़ाइन किए गए हैं और पासवर्ड हैश को भंग करने के लिए कठिन हैं।

यदि आप उनमें से किसी का भी उपयोग करते हैं , यहां तक कि लवण भी शामिल है, तो आपको जल्द से जल्द अनुशंसित सुरक्षित एल्गोरिदम में से एक पर स्विच करना चाहिए।

असुरक्षित माने जाने वाले एल्गोरिदम:

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

  • SHA-2
  • SHA-3

ध्यान दें, SHA256 और SHA512 जैसे मजबूत हैश अखंड और मजबूत हैं, हालांकि यह आम तौर पर bcrypt या argon2 हैश कार्यों का उपयोग करने के लिए अधिक सुरक्षित है क्योंकि इन एल्गोरिदम के खिलाफ जानवर बल के हमले शास्त्रीय कंप्यूटरों के लिए बहुत अधिक कठिन हैं।

निर्धारित करें कि क्या मौजूदा पासवर्ड हैश को एक मजबूत एल्गोरिथ्म में अपग्रेड किया जा सकता है

यदि आप PASSWORD_DEFAULT पद्धति का उपयोग कर रहे हैं, तो सिस्टम को पासवर्ड के साथ हैश करने के लिए सबसे अच्छा एल्गोरिथ्म चुनने की अनुमति दें, क्योंकि डिफ़ॉल्ट रूप से ताकत में वृद्धि होती है, आप पुराने पासवर्ड को फिर से उपयोग करना चाहते हैं क्योंकि उपयोगकर्ता लॉग इन करते हैं

<?php
// first determine if a supplied password is valid
if (password_verify($plaintextPassword, $hashedPassword)) {

    // now determine if the existing hash was created with an algorithm that is
    // no longer the default
    if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {

        // create a new hash with the new default
        $newHashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT);

        // and then save it to your data store
        //$db->update(...);
    }
}
?>

अगर पासवर्ड_ * फ़ंक्शंस आपके सिस्टम पर उपलब्ध नहीं हैं (और आप नीचे टिप्पणी में लिंक किए गए संगतता पैक का उपयोग नहीं कर सकते हैं), तो आप एल्गोरिथ्म निर्धारित कर सकते हैं और मूल हैश बनाने के लिए निम्न के समान विधि का उपयोग कर सकते हैं:

<?php
if (substr($hashedPassword, 0, 4) == '$2y$' && strlen($hashedPassword) == 60) {
    echo 'Algorithm is Bcrypt';
    // the "cost" determines how strong this version of Bcrypt is
    preg_match('/\$2y\$(\d+)\$/', $hashedPassword, $matches);
    $cost = $matches[1];
    echo 'Bcrypt cost is '.$cost;
}
?>

पासवर्ड हैश बनाना

मौजूदा उद्योग के सर्वोत्तम-अभ्यास मानक हैश या कुंजी व्युत्पत्ति का उपयोग करने के लिए password_hash() का उपयोग करके पासवर्ड हैश बनाएँ। लेखन के समय, मानक bcrypt है , जिसका अर्थ है, कि PASSWORD_DEFAULT में PASSWORD_BCRYPT जैसा ही मान है।

$options = [
    'cost' => 12,
];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);

तीसरा पैरामीटर अनिवार्य नहीं है

आपके उत्पादन सर्वर के हार्डवेयर के आधार पर 'cost' मूल्य चुना जाना चाहिए। इसे बढ़ाने से पासवर्ड अधिक महंगा हो जाएगा। यह जितना महंगा होगा, उतना ही अधिक समय के लिए इसे क्रैक करने की कोशिश करने वाले को उत्पन्न करेगा। लागत आदर्श रूप से यथासंभव अधिक होनी चाहिए, लेकिन व्यवहार में इसे सेट किया जाना चाहिए ताकि यह सब कुछ बहुत धीमा न करे। कहीं 0.1 और 0.4 सेकंड के बीच ठीक होगा। यदि आप संदेह में हैं तो डिफ़ॉल्ट मान का उपयोग करें।

5.5

PHP में 5.5.0 से कम पासवर्ड_ password_* फ़ंक्शंस उपलब्ध नहीं हैं। आपको उन कार्यों को प्रतिस्थापित करने के लिए संगतता पैक का उपयोग करना चाहिए। संगतता पैक की सूचना के लिए PHP 5.3.7 या उच्चतर या एक संस्करण की आवश्यकता होती है जिसमें $2y फिक्स बैकपोर्ट है (जैसे RedHo प्रदान करता है)।

यदि आप उन का उपयोग करने में सक्षम नहीं हैं, तो आप crypt() साथ पासवर्ड हैशिंग को लागू कर सकते password_hash() crypt() फ़ंक्शन के आसपास एक आवरण के रूप में लागू किया जाता है, आपको किसी भी कार्यक्षमता को खोने की आवश्यकता नहीं है।

// this is a simple implementation of a bcrypt hash otherwise compatible
// with `password_hash()`
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation

// if `CRYPT_BLOWFISH` is 1, that means bcrypt (which uses blowfish) is available
// on your system
if (CRYPT_BLOWFISH == 1) {
    $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    // crypt uses a modified base64 variant
    $source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = strtr(rtrim($salt, '='), $source, $dest);
    $salt = substr($salt, 0, 22);
    // `crypt()` determines which hashing algorithm to use by the form of the salt string
    // that is passed in
    $hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}

पासवर्ड के लिए नमक हैश

क्रिप्ट एल्गोरिथ्म की विश्वसनीयता के बावजूद अभी भी इंद्रधनुष तालिकाओं के खिलाफ भेद्यता है। यही कारण है कि, नमक का उपयोग करने की सिफारिश क्यों की जाती है।

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

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

bcrypt password_hash() bcrypt एल्गोरिथ्म के साथ, सादे टेक्स्ट नमक को परिणामस्वरूप हैश के साथ संग्रहीत किया जाता है, जिसका अर्थ है कि हैश को विभिन्न प्रणालियों और प्लेटफार्मों में स्थानांतरित किया जा सकता है और फिर भी मूल पासवर्ड के खिलाफ मिलान किया जा सकता है।

7.0

यहां तक कि जब यह हतोत्साहित किया जाता है, तो आप अपने खुद के यादृच्छिक नमक को परिभाषित करने के लिए salt विकल्प का उपयोग कर सकते हैं।

 $options = [
        'salt' => $salt, //see example below
 ];

महत्वपूर्ण है । यदि आप इस विकल्प को छोड़ देते हैं, तो पासवर्ड पासवर्ड के लिए पासवर्ड_हाश () द्वारा एक यादृच्छिक नमक उत्पन्न किया जाएगा। यह ऑपरेशन का इच्छित मोड है।

7.0

नमक विकल्प दिया गया है पदावनत पीएचपी 7.0.0 के रूप में। अब यह डिफ़ॉल्ट रूप से उत्पन्न होने वाले नमक का उपयोग करने के लिए पसंद किया जाता है।

एक हैश के खिलाफ पासवर्ड का सत्यापन

password_verify() एक ज्ञात हैश के खिलाफ पासवर्ड की वैधता को सत्यापित करने के लिए अंतर्निहित फ़ंक्शन (PHP 5.5 के रूप में) प्रदान किया गया है।

<?php
if (password_verify($plaintextPassword, $hashedPassword)) {
    echo 'Valid Password';
}
else {
    echo 'Invalid Password.';
}
?>

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

यदि आपके सिस्टम पर पासवर्ड_ * फ़ंक्शन उपलब्ध नहीं हैं (और आप नीचे टिप्पणी में लिंक किए गए संगतता पैक का उपयोग नहीं कर सकते हैं) तो आप crypt() फ़ंक्शन के साथ पासवर्ड सत्यापन को लागू कर सकते हैं। कृपया ध्यान दें कि समय के हमलों से बचने के लिए विशिष्ट सावधानी बरतनी चाहिए।

<?php
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation
if (CRYPT_BLOWFISH == 1) {
    // `crypt()` discards all characters beyond the salt length, so we can pass in
    // the full hashed password
    $hashedCheck = crypt($plaintextPassword, $hashedPassword);

    // this a basic constant-time comparison based on the full implementation used
    // in `password_hash()`
    $status = 0;
    for ($i=0; $i<strlen($hashedCheck); $i++) {
        $status |= (ord($hashedCheck[$i]) ^ ord($hashedPassword[$i]));
    }

    if ($status === 0) {
        echo 'Valid Password';
    }
    else {
        echo 'Invalid Password';
    }
}
?>


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow