Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiorna tutte le righe in DataBase con un valore hash

Per prima cosa devo dire che se hai dati non sensibili in un db, le funzioni mysql integrate possono darti risultati di hash direttamente con le istruzioni di aggiornamento usando solo mysql.

Questa risposta non riguarda questo. Si tratta di dati sensibili, come le password.

Ti ho fornito un link a un password_hash() PHP e password_verify() esempio.

Ecco Quel link ancora. Quel collegamento a sinistra è per DOP. Il seguente Link proprio qui è simile e per MySQL.

Nel link PDO guarda la riga

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

Quindi supponiamo che ora tu abbia una colonna con testo in chiaro chiamata ctPassword . Dovresti alter table e aggiungi una nuova colonna per qualcosa come hashedPassword . Segui il link che ho fornito, modifica di conseguenza, esegui l'hashing dei valori di ctPassword in hashedPassword con una dichiarazione di aggiornamento.

Quindi testalo a fondo. Quando tutto va bene nel mondo, abbandona il ctPassword colonna e non usarlo mai più. Per essere chiari , non archiviare mai le password in chiaro nei database. Memorizza i valori hash unidirezionali e verificali. I link sopra mostrano come.

Modifica

Qui è interamente da PHP da cui penso che questo debba essere guidato, al contrario delle funzioni hash mysql, che schifo. Dopotutto, stai usando PHP, ed è lì che il loro robusto hashing e verifica brilleranno. Le migliori pratiche secondo me, mentre la gente di MySQL non ci spende esattamente la larghezza di banda mentale. Sono tutto per fare il più possibile in MySQL. Ma mai questo argomento, usando gli hash. Lascia che PHP guidi questo.

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

Arriva l'idea, ehi, voglio hash sicuri ora. Potrei essere hackerato.

-- 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 per eseguire il ciclo e aggiornare una nuova colonna destinata a ripulire prima di non avere un concetto di hash (che penso che abbiamo visto tutti 1 milione di volte nello stack)

PHP per l'applicazione di patch:

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

Esegui lo script php, verifica i risultati. Quelli sono miei, i tuoi saranno differire. Il tuo sarà anche diverso dal tuo se lo esegui di nuovo. Motivo menzionato nel codice.

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