Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualizar todas as linhas no banco de dados com um valor de hash


Primeiro devo dizer que se você tiver dados não sensíveis em um banco de dados, as funções internas do mysql podem fornecer resultados de hashes diretamente com instruções de atualização usando apenas mysql.

Esta resposta não é sobre isso. Trata-se de dados confidenciais, como senhas.

Eu te dei um link para um PHP password_hash() e password_verify() exemplo.

Aqui está Esse link novamente. Esse link à esquerda é para PDO. O seguinte Link aqui é semelhante e para mysqli.

No link PDO veja a linha
$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using 

Então, digamos que você tenha uma coluna agora com texto claro chamado ctPassword . Você alter table e adicione uma nova coluna para algo como hashedPassword . Siga o link que forneci, ajuste de acordo, faça o hash dos valores de ctPassword em hashedPassword com uma declaração de atualização.

Em seguida, teste-o cuidadosamente. Quando tudo estiver certo no mundo, solte a ctPassword coluna e nunca mais a use. Para ser claro , nunca armazene senhas de texto não criptografado em bancos de dados. Armazene valores de hash unidirecionais e verifique-os. Os links acima mostram como.

Editar


Aqui é inteiramente do PHP, de onde acho que isso precisa ser conduzido, em oposição às funções de hash do mysql, eca. Afinal, você está usando PHP, e é lá que seu hashing e verificação robustos vão brilhar. Melhores práticas na minha opinião, enquanto o pessoal do mysql não gasta exatamente a largura de banda mental nisso. Eu sou tudo para fazer o máximo possível no mysql. Mas nunca este tópico, usando hashes. Deixe o PHP conduzir este.

Esquema

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

Junto vem a noção, ei, eu quero hashes seguros agora. Eu posso ser hackeado.
-- 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 para fazer um loop e atualizar uma nova coluna destinada a limpar antes de não ter um conceito de hash (que acho que todos vimos 1 milhão de vezes na pilha)

PHP para aplicação de patches:
<?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();
    }
?>

Execute o script php, verifique os resultados. Esses são meus, os seus serão diferem. O seu será ainda diferente do seu se você executá-lo novamente. Motivo mencionado no código.
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 |
+----+-------------+---------------------+--------------------------------------------------------------+