Mysql
 sql >> база данни >  >> RDS >> Mysql

Актуализирайте всички редове в базата данни с хеш стойност

Първо трябва да кажа, че ако имате нечувствителни данни в db, тогава вградените функции на mysql могат да ви дадат резултати от хешове директно с инструкции за актуализиране, използвайки само mysql.

Този отговор не е за това. Става дума за чувствителни данни, като пароли.

Дадох ви връзка към PHP password_hash() и password_verify() пример.

Ето Тази връзка отново. Тази връзка вляво е за PDO. Следната Връзка точно тук е подобен и за mysqli.

В PDO връзката вижте реда

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

Така че да приемем, че сега имате колона с чист текст, наречена ctPassword . Вие бихте alter table и добавете нова колона за нещо като hashedPassword . Следвайте тази връзка, която предоставих, настройте съответно, хеширайте стойностите на ctPassword в hashedPassword с изявление за актуализиране.

След това го тествайте внимателно. Когато всичко е наред в света, запуснете ctPassword колона и никога повече не я използвайте. За да бъде ясно , никога не съхранявайте пароли с чист текст в бази данни. Съхранявайте еднопосочните хеш стойности и проверете спрямо тях. Горните връзки показват как.

Редактиране

Тук е изцяло от PHP, където мисля, че това трябва да се управлява от, за разлика от хеш функциите на mysql, фу. В крайна сметка, вие използвате PHP и именно там тяхното стабилно хеширане и проверка ще блесне. Най-добрите практики според мен, докато хората на mysql не харчат точно умствената честотна лента за това. Аз съм за това да се прави колкото е възможно повече в mysql. Но никога тази тема, използвайки хешове. Нека PHP управлява този.

Схема

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

Идва и идеята, хей, сега искам безопасни хешове. Може да ме хакнат.

-- 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 да премине през и актуализира нова колона, предназначена да изчисти, преди да няма хеш концепция (която мисля, че всички сме виждали 1 милион пъти в стека)

PHP за корекция:

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

Стартирайте php скрипта, проверете резултатите. Това са мои, твоята воля различават. Вашият дори ще се различава от вашия, ако го стартирате отново. Причината, посочена в кода.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избиране на потребители, на които не е изпратен бюлетин

  2. SQL - Как да транспонирам?

  3. mysql команда за показване на текущите конфигурационни променливи

  4. Как мога да нулирам 'root' потребителското поведение по подразбиране на MySQL 5.7

  5. Как мога да поставя две заявки в една mysql_query?