Password Hashing
Plain passwords कभी न रखें
Login security का सबसे ज़रूरी नियम: password को कभी plain text में store न करें। अगर आपका database कभी चोरी हो, plain passwords सीधे attacker के हाथ लग जाते हैं। इसके बजाय आप hash store करते हैं — एक scrambled, one-way रूप — PHP के built-in functions से, जो आसान भी हैं और बहुत मज़बूत भी।
Password hash करना
जब user sign up करे, save करने से पहले उसका password hash कीजिए।
<?php
$password = "mySecret123";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash; // एक लंबा scrambled string
?>
password_hash मज़बूत algorithm (default bcrypt) इस्तेमाल करता है और अपने-आप random salt जोड़ता है। यह hash अपनी users table में save कीजिए — असली password नहीं।
Login पर verify करना
Login पर, डाले गए password की store hash से तुलना कीजिए।
<?php
$entered = "mySecret123";
$storedHash = "$2y$10$Ku3..."; // database से
if (password_verify($entered, $storedHash)) {
echo "Login success";
} else {
echo "Wrong password";
}
?>
password_verify डाले गए password को hash से जाँचता है और true या false देता है। आप hash कभी decrypt नहीं करते — सिर्फ़ उसके ख़िलाफ़ verify करते हैं।
Hashing सुरक्षित क्यों है
Hash one-way होता है: password को hash में बदल सकते हैं, पर hash को वापस password में नहीं। तो attackers आपका database चुरा भी लें, उन्हें सिर्फ़ scrambled hashes मिलते हैं, इस्तेमाल योग्य passwords नहीं। automatic random salt का मतलब भी है कि एक ही password वाले दो users को अलग hashes मिलते हैं, precomputed attack tables को नाकाम करके।
Hashes अपडेट रखना
<?php
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$newHash = password_hash($entered, PASSWORD_DEFAULT);
// $newHash database में save कीजिए
}
?>
जैसे-जैसे PHP अपना default algorithm सुधारती है, password_needs_rehash आपको अगले सफल login पर पुराने hashes अपने-आप upgrade करने देता है — बिना user मेहनत के security current रखकर।
आम गलतियाँ
- Plain passwords store करना। Classic, ख़तरनाक गलती — हमेशा hash कीजिए।
- md5 या sha1 जैसे पुराने functions इस्तेमाल करना। ये passwords के लिए सुरक्षित नहीं;
password_hashइस्तेमाल कीजिए। - Hash को decrypt करने की कोशिश। Hashes one-way हैं — इसके बजाय
password_verifyसे verify कीजिए। - अपना कमज़ोर salt जोड़ना। ज़रूरत नहीं —
password_hashआपके लिए salt करता है।
सारांश
- Plain passwords कभी store न करें — हमेशा hash store कीजिए।
password_hash($pw, PASSWORD_DEFAULT)से hash कीजिए।- Logins को
password_verify($entered, $hash)से जाँचिए। - Hashes one-way और अपने-आप salted हैं — बहुत सुरक्षित।
- Hashes current रखने को
password_needs_rehashइस्तेमाल कीजिए।
आगे, पूरा flow बनाइए login और registration में, या database सुरक्षित कीजिए prepared statements से।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
passwords को plain text में कभी क्यों न रखूँ?
password_hash क्या करता है?
password_hash($password, PASSWORD_DEFAULT) एक मज़बूत algorithm (अभी bcrypt) से password को लंबे, scrambled hash में बदल देता है। आप यह hash store करते हैं, कभी असली password नहीं।Login पर password कैसे जाँचें?
password_verify($entered, $storedHash) इस्तेमाल कीजिए। यह true देता है अगर डाला गया password store hash से मेल खाए, वरना false। आप hash को कभी "decrypt" नहीं करते — उसके ख़िलाफ़ verify करते हैं।क्या hash को वापस password में बदल सकते हैं?
क्या मुझे अपना salt जोड़ना पड़ता है?
password_hash हर hash में अपने-आप एक unique random salt जोड़ता है, तो एक ही password वाले दो users को अलग hashes मिलते हैं। salt आप खुद संभालते नहीं।