sql >> Databáze >  >> RDS >> Mysql

Aktualizujte všechny řádky v databázi pomocí hodnoty hash

Nejprve musím říci, že pokud máte v db necitlivá data, pak vám vestavěné funkce mysql mohou poskytnout výsledky hash přímo pomocí příkazů aktualizace pouze pomocí mysql.

O tom tato odpověď není. Jde o citlivá data, jako jsou hesla.

Dal jsem vám odkaz na PHP password_hash() a password_verify() příklad.

Zde je Tento odkaz znovu. Ten odkaz vlevo je pro PDO. Následující odkaz zde je podobný a pro mysqli.

V odkazu PDO se podívejte na řádek

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

Řekněme tedy, že nyní máte sloupec s čistým textem nazvaný ctPassword . alter table a přidejte nový sloupec pro něco jako hashedPassword . Postupujte podle uvedeného odkazu, podle toho upravte a hashujte hodnoty ctPassword do hashedPassword s aktualizačním prohlášením.

Poté důkladně otestujte. Když je na světě vše v pořádku, odhoďte ctPassword sloupec a nikdy jej znovu nepoužívejte. Aby bylo jasno , nikdy neukládejte hesla ve formátu prostého textu do databází. Ukládejte jednosměrné hodnoty hash a ověřujte je podle nich. Výše uvedené odkazy ukazují, jak na to.

Upravit

Tady je úplně z PHP, kde si myslím, že to musí být řízeno, na rozdíl od hašovacích funkcí mysql, fuj. Koneckonců používáte PHP a právě tam zazáří jejich robustní hašování a ověřování. Podle mého názoru osvědčené postupy, zatímco lidé z mysql na to zrovna nevynakládají mentální šířku pásma. Jsem pro toho, abychom v mysql udělali co nejvíce. Ale nikdy toto téma, pomocí hashů. Nechte PHP řídit toto.

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

Přichází myšlenka, hej, teď chci bezpečné hashe. Mohl bych být hacknut.

-- 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 pro procházení a aktualizaci nového sloupce určeného k vyčištění před tím, než nebude mít koncept hash (který jsme podle mě všichni viděli v zásobníku 1 milionkrát)

PHP pro opravy:

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

Spusťte php skript, ověřte výsledky. Ty jsou moje, vaše budou lišit. Váš se bude dokonce lišit od vašeho, pokud jej znovu spustíte. Důvod uvedený v kódu.

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. MySQL SELECT LIKE nebo REGEXP pro shodu více slov v jednom záznamu

  2. Nedefinovaný indexový obrázek v php

  3. Uložení více e-mailových adres v databázi pro různé typy uživatelů

  4. Je v Apache Spark 2.0.0 možné načíst dotaz z externí databáze (spíše než uchopit celou tabulku)?