Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mettre à jour toutes les lignes de la base de données avec une valeur de hachage

Tout d'abord, je dois dire que si vous avez des données non sensibles dans une base de données, les fonctions mysql intégrées peuvent vous donner directement les résultats des hachages avec des instructions de mise à jour en utilisant uniquement mysql.

Cette réponse ne concerne pas cela. Il s'agit de données sensibles, comme les mots de passe.

Je vous ai donné un lien vers un PHP password_hash() et password_verify() exemple.

Voici ce lien encore. Ce lien à gauche est pour PDO. Le Lien juste ici est similaire et pour mysqli.

Dans le lien PDO regardez la ligne

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

Supposons donc que vous ayez maintenant une colonne contenant du texte en clair appelée ctPassword . Vous allez alter table et ajoutez une nouvelle colonne pour quelque chose comme hashedPassword . Suivez ce lien que j'ai fourni, ajustez en conséquence, hachez les valeurs de ctPassword dans hashedPassword avec une instruction de mise à jour.

Ensuite, testez-le soigneusement. Quand tout va bien dans le monde, déposez le ctPassword colonne et ne l'utilisez plus jamais. Pour être clair , ne stockez jamais de mots de passe en texte clair dans des bases de données. Stockez les valeurs de hachage unidirectionnelles et vérifiez-les. Les liens ci-dessus montrent comment.

Modifier

Voici entièrement de PHP où je pense que cela doit être piloté, par opposition aux fonctions de hachage mysql, beurk. Après tout, vous utilisez PHP, et c'est là que leur hachage et leur vérification robustes vont briller. Les meilleures pratiques à mon avis, alors que les gens de mysql ne dépensent pas exactement la bande passante mentale dessus. Je suis tout à fait pour faire autant que possible dans mysql. Mais jamais ce sujet, en utilisant des hachages. Laissez PHP piloter celui-ci.

Schéma

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

Vient ensuite la notion, hé, je veux des hachages sûrs maintenant. Je pourrais me faire pirater.

-- 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 pour boucler et mettre à jour une nouvelle colonne destinée à nettoyer avant de ne pas avoir de concept de hachage (que je pense que nous avons tous vu 1 million de fois sur la pile)

PHP pour les correctifs :

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

Exécutez le script php, vérifiez les résultats. Ce sont les miens, les vôtres le feront différer. Le vôtre sera même différent du vôtre si vous l'exécutez à nouveau. Raison mentionnée dans le code.

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