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

MYSQL:यदि कथन के साथ प्रक्रिया

आपको वास्तव में उन पासवर्डों को हैश करना चाहिए, निम्न कोड का उपयोग करें

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45),
    in_PassOld VARCHAR(45),
    in_PassNew VARCHAR(45)
)
BEGIN
  DECLARE KnowsOldPassword INTEGER;

  SELECT count(*) INTO KnowsOldPassword 
    FROM User 
    WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512);
  IF (KnowsOldPassword > 0) THEN
    UPDATE User 
      SET Passhash = SHA2(CONCAT(salt, inPassNew),512) 
      WHERE Email = in_Email;
  END IF;
END $$

DELIMITER ;

salt तालिका में एक अतिरिक्त फ़ील्ड है user यह कमोबेश यादृच्छिक है, लेकिन इसे गुप्त रखने की आवश्यकता नहीं है। यह रेनबो टेबल को हराने का काम करता है .
आप नमक को एक छोटी स्ट्रिंग चार(10) या यादृच्छिक डेटा पर सेट कर सकते हैं। जैसे

salt = ROUND(RAND(unix_timestamp(now())*9999999999);

आपको नमक को अपडेट करने की जरूरत नहीं है, बस इसे एक बार जेनरेट करें और फिर इसे स्टोर करें।

इस मुद्दे पर अधिक जानकारी के लिए देखें:
PHP और MySQL के साथ मेरे हैश को नमकीन करना
पुनर्प्राप्ति">बाद में प्लेनटेक्स्ट पुनर्प्राप्ति के लिए मुझे नैतिक रूप से उपयोगकर्ता पासवर्ड संग्रहण तक कैसे पहुंचना चाहिए?

आपके कोड पर एक टिप्पणी

IF(@PassOld == in_PassOld) THEN  //incorrect 
IF(@PassOld = in_PassOld) THEN   //correct, SQL <> 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. हाइबरनेट मानदंड का उपयोग करके बाएं शामिल हों

  2. एसक्यूएल में कैसे सॉर्ट करें, लेखों को अनदेखा करें ('द, ए', ए आदि)

  3. mysql:चयनित दिन की अगली तारीख कैसे प्राप्त करें?

  4. जहां खंड में mysql कास्टिंग स्ट्रिंग को int में रोकें

  5. पुराने_टेबल_नाम के AUTO_INCREMENT मानों के साथ पुराने_टेबल_नाम की तरह नया_टेबल_नाम बनाएं