Първо трябва да кажа, че ако имате нечувствителни данни в 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 |
+----+-------------+---------------------+--------------------------------------------------------------+