Ten eerste moet ik zeggen dat als je niet-gevoelige gegevens in een db hebt, de ingebouwde mysql-functies je resultaten van hashes rechtstreeks kunnen geven met update-instructies met alleen mysql.
Dit antwoord gaat daar niet over. Het gaat over gevoelige gegevens, zoals wachtwoorden.
Ik gaf je een link naar een PHP password_hash()
en password_verify()
voorbeeld.
Hier is Die Link opnieuw. Die link links is voor PDO. De volgende Link hier is vergelijkbaar en voor mysqli.
Kijk in de BOB-link naar de regel
$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using
Dus laten we zeggen dat je nu een kolom hebt met leesbare tekst erin genaamd ctPassword
. Je zou alter table
en voeg een nieuwe kolom toe voor iets als hashedPassword
. Volg die link die ik heb gegeven, pas dienovereenkomstig aan, hash de waarden van ctPassword
in hashedPassword
met een update-statement.
Test het dan grondig. Als alles goed is in de wereld, drop het ctPassword
kolom en gebruik het nooit meer. Voor alle duidelijkheid , sla nooit leesbare wachtwoorden op in databases. Sla one-way hash-waarden op en verifieer deze. De bovenstaande links laten zien hoe.
Bewerken
Dit is volledig van PHP waarvan ik denk dat dit moet worden aangedreven, in tegenstelling tot mysql-hashfuncties, bah. Je gebruikt tenslotte PHP, en het is daar dat hun robuuste hashing en verificatie zal schitteren. Best practices naar mijn mening, terwijl de mysql-mensen er niet echt de mentale bandbreedte aan besteden. Ik ben er helemaal voor om zoveel mogelijk in mysql te doen. Maar nooit dit onderwerp, hashes gebruiken. Laat PHP deze aansturen.
Schema
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');
Dan komt het idee, hé, ik wil nu veilige hashes. Ik word misschien gehackt.
-- 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 om door te lussen en een nieuwe kolom bij te werken die bedoeld is om op te schonen voordat er geen hash-concept is (waarvan ik denk dat we allemaal 1 miljoen keer op de stapel hebben gezien)
PHP voor patchen:
<?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();
}
?>
Voer het php-script uit, controleer de resultaten. Die zijn van mij, die van jou zal verschillen. De jouwe zal zelfs verschillen van de jouwe als je het opnieuw uitvoert. Reden vermeld in de code.
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 |
+----+-------------+---------------------+--------------------------------------------------------------+