php कूटशब्द गलत क्यों है?



password-hash php-password-hash (1)

password_verify गलत क्यों है?

यह सवाल विहित करने का इरादा है और इस विषय पर पूछे गए प्रश्नों की मात्रा के आधार पर बनाया गया है।


ऐसे कई कारण हैं जिनकी वजह से password_verify गलत हो सकता है, यह आपकी तालिका के सेटअप से लेकर पासवर्ड की वास्तविक तुलना तक हो सकता है, नीचे इसके सामान्य कारण विफल हो रहे हैं।

कॉलम सेटअप

  • आपकी तालिका में पासवर्ड कॉलम की लंबाई बहुत कम है:

    • यदि आप PASSWORD_DEFAULT का उपयोग कर रहे हैं, तो परिणाम को एक डेटाबेस कॉलम में संग्रहीत करने की सिफारिश की जाती है, जो 60 वर्णों से आगे बढ़ सकता है (255 वर्ण एक अच्छा विकल्प होगा)।
    • यदि आप PASSWORD_BCRYPT का उपयोग कर रहे हैं, तो परिणाम को 60 वर्णों वाले डेटाबेस कॉलम में संग्रहीत करने की अनुशंसा की जाती है, क्योंकि PASSWORD_BCRYPT में परिणाम हमेशा 60 वर्ण स्ट्रिंग या FALSE विफलता पर होगा।

पासवर्ड स्वच्छता

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

पासवर्ड सत्यापन

password_verify का उपयोग करते समय आपको डेटाबेस / फ़ाइल / कुछ-अन्य-स्टोरेज-विधि से हैश के साथ प्लेनटेक्स्ट पासवर्ड की तुलना करने की आवश्यकता है, हैश की तुलना नहीं (यहां निहितार्थ यह है कि आपके द्वारा पंजीकृत उपयोगकर्ता के हैशेड पासवर्ड को संग्रहीत करने की आवश्यकता है) ):

<?php

$hashed = password_hash('test', PASSWORD_DEFAULT);
$password = 'test';

if (password_verify($password, $hashed)) {
  echo 'success';
} else {
  echo 'fail';
}

?>

सुनिश्चित करें कि आप वास्तव में password_verify लिए एक हैश पास कर रहे password_verify और इसे डंप करके कुछ और नहीं।

Repl

हार्डकोड पासवर्ड

इस उदाहरण में कि आप हार्डकोड हैश का उपयोग कर रहे हैं और आप समस्याओं का सामना कर रहे हैं, सुनिश्चित करें कि आप दोहरे उद्धरण चिह्नों के बजाय एकल उद्धरण का उपयोग कर रहे हैं जब चर में मूल्य को संग्रहीत किया जाएगा क्योंकि दोहरे उद्धरणों का उपयोग करते समय $ की व्याख्या की जाएगी:

<?php
// Undefined variable: QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu :1
$incorrect = "$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu";

$correct = '$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu';
?>

Repl - क्रमशः टिप्पणी करें।

समस्या निवारण

var_dump() पंजीकरण पर हैशेड पासवर्ड आपके डेटाबेस में डालने से पहले, और var_dump() इसे फिर से अपने डेटाबेस से लाने के बाद जब आप var_dump() बारे में होते password_verify() । सुनिश्चित करें कि दोनों हैश समान हैं। यदि वे हैं, और प्लेनटेक्स्ट पासवर्ड भी समान हैं, तो इसके लिए कोई कारण नहीं है password_verify विफल। यह केवल तभी विफल होता है जब हैश डेटाबेस के माध्यम से अपने राउंडट्रिप पर किसी तरह से संशोधित हो जाता है, या यदि प्लेटेक्स्ट पासवर्ड समान नहीं हैं।

सुनिश्चित करें कि आप एक सही एल्गोरिथ्म पास कर रहे हैं password_hash में दूसरा पैरामीटर है।

परिशिष्ट

प्रलेखन के अनुसार:

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

जैसा कि ऊपर उल्लेख किया गया है, PHP 7.0 में नमक विकल्प प्रदान करने से एक डिप्रेसेशन चेतावनी उत्पन्न होगी। भविष्य के PHP रिलीज़ में मैन्युअल रूप से नमक प्रदान करने के लिए समर्थन हटाया जा सकता है।





php-password-hash