Обновить все строки в базе данных с хэш-значением

Используя Php & MySQL, я хочу обновить все строки отдельного столбца в DataBase,

Например. : в колонке «Имя» есть строка, содержащая «MyName»,

Вот моя схема, которую я пытаюсь достичь и логика:

  1. Loop База данных

  2. Получить текущее значение для каждой строки и хэш с хешем ('…', value);

Получите существующие значения для каждой строки и хеш-файл & Update, это как я хочу обновить полную базу данных,

Как я могу это достичь?

Во-первых, я должен сказать, что если у вас есть нечувствительные данные в db, то встроенные функции mysql могут давать результаты хэшей напрямую с операторами обновлений, используя только mysql.

Этот ответ не об этом. Речь идет о конфиденциальных данных, таких как пароли.

Я дал вам ссылку на пример PHP password_hash() и password_verify() .

Вот эта ссылка снова. Эта ссылка влево для PDO. Следующая ссылка прямо здесь аналогична и для mysqli.

В ссылке PDO посмотрите на строку

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

Итак, скажем, теперь у вас есть столбец с открытым текстом, который называется ctPassword . Вы alter table бы alter table и добавили новый столбец для чего-то вроде hashedPassword . Следуйте этой ссылке, которую я предоставил, соответственно ctPassword hashedPassword значения ctPassword в hashedPassword с инструкцией по обновлению.

Затем тщательно проверьте его. Когда все будет правильно в мире, ctPassword столбец ctPassword и никогда не используйте его снова. Чтобы быть ясным , никогда не храните текстовые пароли в базах данных. Храните односторонние хеш-значения и проверяйте их. Вышеприведенные ссылки показывают, как.

редактировать

Здесь полностью из PHP, где я думаю, что это нужно изгнать, в отличие от хэш-функций mysql, yuck. В конце концов, вы используете 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 зацикливается и обновляет новый столбец, предназначенный для очистки до того, как не будет иметь концепцию хэша (что, я думаю, мы все видели в стеке 1M раз)

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 | +----+-------------+---------------------+--------------------------------------------------------------+