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

डेटाबेस में सभी पंक्तियों को हैश मान के साथ अपडेट करें

सबसे पहले मुझे यह कहना होगा कि यदि आपके पास डीबी में गैर-संवेदनशील डेटा है, तो अंतर्निहित MySQL फ़ंक्शन आपको केवल mysql का उपयोग करके अपडेट स्टेटमेंट के साथ सीधे हैश के परिणाम दे सकते हैं।

यह उत्तर उसके बारे में नहीं है। यह पासवर्ड जैसे संवेदनशील डेटा के बारे में है।

मैंने आपको एक PHP password_hash() . का लिंक दिया है और password_verify() उदाहरण।

यह रहा वह लिंक फिर से। बाईं ओर का वह लिंक पीडीओ के लिए है। निम्नलिखित यहां लिंक करें समान है और mysqli के लिए।

पीडीओ लिंक में लाइन देखें

$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using 

तो मान लें कि अब आपके पास एक कॉलम है जिसमें क्लीयरटेक्स्ट है जिसे ctPassword . कहा जाता है . आप alter table और hashedPassword . जैसी किसी चीज़ के लिए एक नया कॉलम जोड़ें . मेरे द्वारा प्रदान किए गए लिंक का अनुसरण करें, तदनुसार ट्वीक करें, ctPassword . के मान हैश करें hashedPassword . में अपडेट स्टेटमेंट के साथ।

फिर इसका अच्छी तरह से परीक्षण करें। जब दुनिया में सब ठीक हो, छोड़ें ctPassword कॉलम और फिर कभी इसका इस्तेमाल न करें। स्पष्ट होने के लिए , डेटाबेस में स्पष्ट टेक्स्ट पासवर्ड कभी भी स्टोर न करें। वन-वे हैश मान संग्रहीत करें, और उनके विरुद्ध सत्यापित करें। ऊपर दिए गए लिंक दिखाते हैं कि कैसे।

संपादित करें

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

स्कीमा

create table sometable
(   id int auto_increment primary key,
    userName varchar(40) not null,
    ctPassword varchar(40) not null -- clear text password (means humans can read it, basically)
    -- note, not a great definition of ct but it implies it has not been hashed for safety
);

insert sometable(userName,ctPassword) values
('Brenda','I watch TV too much'),
('Drew','PatriotsWorldChamps'),
('stealth_guy','JFIDU&JF_Anchovies');

साथ में धारणा आती है, हे, मुझे अब सुरक्षित हैश चाहिए। मुझे हैक किया जा सकता है।

-- http://dev.mysql.com/doc/refman/5.7/en/alter-table.html
alter table sometable add column hashedPassword varchar(255);
-- now I have 4 columns, hashedPassword is currently nullable
show create table sometable; -- confirms this fact

PHP को लूप के माध्यम से और एक हैश अवधारणा नहीं होने से पहले साफ करने के लिए एक नया कॉलम अपडेट करें (जो मुझे लगता है कि हम सभी ने स्टैक पर 1M बार देखा है)

पैचिंग के लिए PHP:

<?php
    // turn on error reporting, or wonder why nothing is happening at times
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    //mysqli_report(MYSQLI_REPORT_ALL);
    error_reporting(E_ALL);
    ini_set("display_errors", 1);    // Begin Vault

    // credentials from a secure Vault, not hard-coded
    $servername="localhost";
    $dbname="login_system";
    $username="dbUserName";
    $password="dbPassword";
    // End Vault

    try {
        $db = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $stmt = $db->prepare("select id,ctPassword from sometable");
        $stmt->execute();
        $stmt->bindColumn('id', $theId);        // bind the results into vars by col names
        $stmt->bindColumn('ctPassword', $cPassword);        // ditto

        // http://php.net/manual/en/pdostatement.fetch.php
        while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
            // as we loop thru here, the $theId and $cPassword variables will be auto-magically updated
            // for us because they have been bound as seen above
            $hPassword=password_hash($cPassword,PASSWORD_DEFAULT); // we now have a hashed password based on orig clear text one
            echo $cPassword . "   " . $hPassword . "<br>";
            // each time you run this with same data the hashes will be different due to changes in the salt
            // based on above PASSWORD_DEFAULT (look at manual page for password_hash)
            $sqlUpdate="UPDATE sometable set `hashedPassword`='$hPassword' where `id`=$theId";

            $db->query($sqlUpdate);
        }
        // .. other cleanup as necessary
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
        exit();
    }
?>

PHP स्क्रिप्ट चलाएँ, परिणाम सत्यापित करें। वो मेरे हैं, आपके होगा अलग होना। यदि आप इसे दोबारा चलाते हैं तो आपका भी आपसे अलग होगा। कोड में कारण बताया गया है।

select * from sometable;

+----+-------------+---------------------+--------------------------------------------------------------+
| id | userName    | ctPassword          | hashedPassword                                               |
+----+-------------+---------------------+--------------------------------------------------------------+
|  1 | Brenda      | I watch TV too much | $2y$10$pJ5maui2OlrIPAtISf4u2OqeqEXU9ycDpCNNpp6xDh1uzIv/6ybuW |
|  2 | Drew        | PatriotsWorldChamps | $2y$10$kHAKRSeHLi9cghPKTKox/.kXiFgq6ELWwExGcVvbf1yYprtTvi.Ba |
|  3 | stealth_guy | JFIDU&JF_Anchovies  | $2y$10$HOkBAkP7ZVIZ7NQB50aKAuhG5WjLHU9AtJCiY2E6h/M2YZuxc2l5K |
+----+-------------+---------------------+--------------------------------------------------------------+



  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 में नाम स्ट्रिंग को कैसे विभाजित करें?

  3. मैं Doctrine2 में SQL के YEAR (), MONTH () और DAY () का उपयोग कैसे कर सकता हूं?

  4. सीक्वेलाइज़ मॉडल के साथ अपडेटेड स्टोर न करें

  5. mysql में 2 डेटाटाइम घटाएं (एक 24 घंटे के प्रारूप में और एक पूर्वाह्न/अपराह्न प्रारूप में)