Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP और MySQL पासवर्ड की तुलना करें

मैं देख रहा हूं कि आप डेटाबेस में पासवर्ड का हैश स्टोर कर रहे हैं, लेकिन अन्य पाठकों के लाभ के लिए, कभी नहीं डेटाबेस में सादे पाठ में पासवर्ड स्टोर करें। आप नहीं बनना चाहते Like Monster.com.uk !

आपको MD5() . की तुलना में अधिक मजबूत हैशिंग फ़ंक्शन का उपयोग करना चाहिए . आदर्श रूप से आपको SHA256 का उपयोग करना चाहिए। यह हैश विधि PHP में hash() का उपयोग करके उपलब्ध है समारोह।

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

आपको mysqli का उपयोग करना सीखना चाहिए पुराने mysql एक्सटेंशन के बजाय एक्सटेंशन। Mysqli पैरामीटरयुक्त प्रश्नों का समर्थन करता है, ताकि आप कुछ SQL इंजेक्शन हमलों की भेद्यता को कम कर सकें।

यहाँ कुछ उदाहरण कोड है। मैंने इसका परीक्षण नहीं किया है, लेकिन यह काम करने के काफी करीब होना चाहिए:

$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;

कुछ अन्य लोगों का सुझाव है कि क्वेरी को login = ? AND password = ? लेकिन मुझे ऐसा करना पसंद नहीं है। यदि आप ऐसा करते हैं, तो आप यह नहीं जान सकते कि लुकअप विफल हुआ क्योंकि लॉगिन मौजूद नहीं था, या क्योंकि उपयोगकर्ता ने गलत पासवर्ड प्रदान किया था।

बेशक आपको उस उपयोगकर्ता को प्रकट नहीं करना चाहिए जिसके कारण लॉगिन प्रयास विफल हुआ, लेकिन आप जानने की आवश्यकता हो सकती है, ताकि आप संदिग्ध गतिविधि लॉग कर सकें।

@ जेवियर अपने जवाब में कहता है कि आपको डेटाबेस से पासवर्ड (या इस मामले में पासवर्ड हैश) पुनर्प्राप्त नहीं करना चाहिए। मैं सहमत नहीं हूं।

जेवियर md5() को कॉल करते हुए दिखाता है PHP कोड में और परिणामी हैश स्ट्रिंग को डेटाबेस में भेजना। लेकिन यह पासवर्ड को आसानी से नमकीन करने का समर्थन नहीं करता है। PHP में हैश करने से पहले आपको इस उपयोगकर्ता के नमक को पुनः प्राप्त करने के लिए एक अलग क्वेरी करनी होगी।

विकल्प सादा पाठ . भेज रहा है अपने PHP ऐप से अपने डेटाबेस सर्वर पर नेटवर्क पर पासवर्ड। आपके नेटवर्क को वायरटैपिंग करने वाला कोई भी व्यक्ति इस पासवर्ड को देख सकता है। यदि आपके पास SQL ​​​​क्वेरी लॉग की जा रही हैं, तो लॉग तक पहुंच प्राप्त करने वाला कोई भी व्यक्ति पासवर्ड देख सकता है। प्रेरित हैकर पुराने फाइल सिस्टम बैकअप मीडिया को खोजने के लिए डंपस्टर-डाइव भी कर सकते हैं, और लॉग फाइलों को इस तरह पढ़ सकते हैं!

डेटाबेस से पासवर्ड हैश स्ट्रिंग को PHP ऐप में लाने का जोखिम कम है, इसकी तुलना उपयोगकर्ता के इनपुट के हैश से करें (PHP कोड में भी), और फिर इन चरों को त्याग दें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या MySql बड़े डेटाबेस के लिए अच्छा है?

  2. MySQL में सही/गलत बनाम 0/1

  3. MySQL ड्रॉप टेबल

  4. GUI का उपयोग करके MySQL कार्यक्षेत्र में स्थिति और सिस्टम चर कैसे देखें?

  5. एक-से-अनेक संबंध के साथ जुड़ने का उपयोग करके SQL प्रश्नों को कम करना