Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Aktualisieren Sie alle Zeilen in der Datenbank mit einem Hash-Wert

Zuerst muss ich sagen, dass, wenn Sie nicht-sensible Daten in einer Datenbank haben, die eingebauten MySQL-Funktionen Ihnen Ergebnisse von Hashes direkt mit Update-Anweisungen geben können, indem Sie nur mysql verwenden.

Diese Antwort handelt nicht davon. Es geht um sensible Daten, wie Passwörter.

Ich habe Ihnen einen Link zu einem PHP password_hash() gegeben und password_verify() Beispiel.

Hier ist dieser Link wieder. Der Link auf der linken Seite ist für PDO. Der folgende Link direkt hier ist ähnlich und für mysqli.

Sehen Sie sich im PDO-Link die Zeile

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

Nehmen wir also an, Sie haben jetzt eine Spalte mit Klartext namens ctPassword . Sie würden alter table und fügen Sie eine neue Spalte für so etwas wie hashedPassword hinzu . Folgen Sie diesem Link, den ich bereitgestellt habe, passen Sie ihn entsprechend an und hashen Sie die Werte von ctPassword in hashedPassword mit einer Update-Anweisung.

Dann ausgiebig testen. Wenn alles in Ordnung ist, fallen das ctPassword Spalte und verwenden Sie es nie wieder. Um es klar zu sagen , speichern Sie niemals Klartext-Passwörter in Datenbanken. Speichern Sie Einweg-Hash-Werte und verifizieren Sie sie. Die obigen Links zeigen wie.

Bearbeiten

Hier ist vollständig von PHP, wo ich denke, dass dies im Gegensatz zu MySQL-Hash-Funktionen, igitt, angetrieben werden muss. Schließlich verwenden Sie PHP, und dort wird ihr robustes Hashing und ihre Überprüfung glänzen. Best Practices meiner Meinung nach, während die MySQL-Leute nicht gerade die mentale Bandbreite dafür ausgeben. Ich bin dafür, so viel wie möglich in MySQL zu tun. Aber niemals dieses Thema, mit Hashes. Lassen Sie PHP diesen steuern.

Schema

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');

Da kommt die Vorstellung, hey, ich will jetzt sichere Hashes. Ich könnte gehackt werden.

-- 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 zum Durchschleifen und Aktualisieren einer neuen Spalte, die aufräumen soll, bevor kein Hash-Konzept vorhanden ist (das wir alle 1 Million Mal auf dem Stack gesehen haben)

PHP zum Patchen:

<?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();
    }
?>

Führen Sie das PHP-Skript aus, überprüfen Sie die Ergebnisse. Das sind meine, deine werden abweichen. Ihre wird sich sogar von Ihrer unterscheiden, wenn Sie sie erneut ausführen. Im Code erwähnter Grund.

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 |
+----+-------------+---------------------+--------------------------------------------------------------+