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

Opdater alle rækker i databasen med en hashværdi

Først må jeg sige, at hvis du har ikke-følsomme data i en db, så kan de indbyggede mysql-funktioner give dig resultater af hashes direkte med opdateringsudsagn ved hjælp af kun mysql.

Dette svar handler ikke om det. Det handler om følsomme data, såsom adgangskoder.

Jeg gav dig et link til en PHP password_hash() og password_verify() eksempel.

Her er Dette link igen. Det link til venstre er for PDO. Følgende Link lige her er lignende og til mysqli.

I PDO-linket se på linjen

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

Så lad os sige, at du nu har en kolonne med klartekst i kaldet ctPassword . Du ville alter table og tilføje en ny kolonne for noget som hashedPassword . Følg det link, jeg angav, juster i overensstemmelse hermed, hash værdierne af ctPassword ind i hashedPassword med en opdateringserklæring.

Så test det grundigt. Når alt er rigtigt i verden, slip ctPassword kolonne og aldrig bruge den igen. For at være tydelig , gem aldrig klartekstadgangskoder i databaser. Gem envejs-hash-værdier, og bekræft mod dem. Ovenstående links viser hvordan.

Rediger

Her er helt fra PHP, hvor jeg tror, ​​det skal køres fra, i modsætning til mysql hash-funktioner, yuck. Når alt kommer til alt, bruger du PHP, og det er der, at deres robuste hashing og verifikation kommer til at skinne. Bedste praksis efter min mening, hvorimod mysql-folkene ikke ligefrem bruger den mentale båndbredde på det. Jeg er helt for at gøre så meget som muligt i mysql. Men aldrig dette emne, ved hjælp af hashes. Lad PHP drive denne.

Skema

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

Sammen kommer ideen, hey, jeg vil have sikre hashes nu. Jeg kan blive hacket.

-- 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 til at gå igennem og opdatere en ny kolonne beregnet til at rydde op, før du ikke har et hash-koncept (som jeg tror, ​​vi alle har set 1M gange på stakken)

PHP til patching:

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

Kør php-scriptet, bekræft resultaterne. De er mine, dine vil afvige. Din vil endda adskille sig fra din, hvis du kører den igen. Årsag nævnt i koden.

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. Hvordan øger man den maksimale uploadfilstørrelse for LOAD DATA INFILE-forespørgslen?

  2. MySQL:få MAX eller GREATEST af flere kolonner, men med NULL-felter

  3. AMD, Intel og PostgreSQL

  4. Lær MySQL / MariaDB for begyndere – del 1