sql >> Databasteknik >  >> RDS >> Mysql

Uppdatera alla rader i databasen med ett hashvärde

Först måste jag säga att om du har okänsliga data i en db, så kan de inbyggda mysql-funktionerna ge dig resultat av hash direkt med uppdateringssatser med bara mysql.

Det här svaret handlar inte om det. Det handlar om känslig data, som lösenord.

Jag gav dig en länk till en PHP password_hash() och password_verify() exempel.

Här är den länken om igen. Den länken till vänster är för PDO. Följande länk här är liknande och för mysqli.

I PDO-länken titta på raden

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

Så låt oss säga att du nu har en kolumn med klartext i den som heter ctPassword . Du skulle alter table och lägg till en ny kolumn för något som hashedPassword . Följ den länken jag gav, justera därefter, hasha värdena för ctPassword till hashedPassword med ett uppdateringsmeddelande.

Testa det sedan noggrant. När allt är rätt i världen, släpp ctPassword kolumn och använd den aldrig igen. För att vara tydlig , lagra aldrig klartextlösenord i databaser. Lagra enkelriktade hashvärden och verifiera mot dem. Länkarna ovan visar hur.

Redigera

Här är helt och hållet från PHP där jag tror att detta måste drivas ifrån, i motsats till mysql-hash-funktioner, yuck. När allt kommer omkring använder du PHP, och det är där som deras robusta hashning och verifiering kommer att lysa. Bästa praxis enligt min mening, medan mysql-folket inte precis spenderar den mentala bandbredden på det. Jag är allt för att göra så mycket som möjligt i mysql. Men aldrig detta ämne, med hjälp av hash. Låt PHP driva den här.

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

Tillsammans kommer tanken, hej, jag vill ha säkra hash nu. Jag kan bli hackad.

-- 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 för att gå igenom och uppdatera en ny kolumn som är avsedd att rensa upp innan man inte har ett hashkoncept (som jag tror att vi alla har sett 1 miljon gånger i stacken)

PHP för patchning:

<?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-skriptet, verifiera resultaten. De är mina, din vilja skilja sig. Din kommer till och med att skilja sig från din om du kör den igen. Orsak som nämns 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. I tsql är en Insert med en Select-sats säker när det gäller samtidighet?

  2. Använder LOAD DATA LOCAL INFILE i Java

  3. Django Migrations:A Primer

  4. Köra 2 frågor samtidigt på Oracle SQL Developer?