Pertama saya harus mengatakan bahwa jika Anda memiliki data non-sensitif dalam db, maka fungsi mysql bawaan dapat memberi Anda hasil hash secara langsung dengan pernyataan pembaruan hanya menggunakan mysql.
Jawaban ini bukan tentang itu. Ini tentang data sensitif, seperti kata sandi.
Saya memberi Anda tautan ke password_hash()
PHP dan password_verify()
contoh.
Ini Tautan Itu lagi. Tautan di sebelah kiri itu untuk PDO. Berikut Tautan Di Sini serupa dan untuk mysqli.
Pada link PDO lihat pada baris
$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using
Jadi katakanlah Anda sekarang memiliki kolom dengan cleartext di dalamnya yang disebut ctPassword
. Anda akan alter table
dan tambahkan kolom baru untuk sesuatu seperti hashedPassword
. Ikuti tautan yang saya berikan, sesuaikan, hash nilai ctPassword
ke hashedPassword
dengan pernyataan pembaruan.
Kemudian mengujinya secara menyeluruh. Saat semuanya baik-baik saja di dunia, jatuhkan ctPassword
kolom dan tidak pernah menggunakannya lagi. Agar jelas , jangan pernah menyimpan kata sandi teks yang jelas dalam database. Simpan nilai hash satu arah, dan verifikasi terhadapnya. Tautan di atas menunjukkan caranya.
Sunting
Ini sepenuhnya dari PHP di mana saya pikir ini perlu didorong, sebagai lawan dari fungsi hash mysql, yuck. Lagi pula, Anda menggunakan PHP, dan di sanalah hashing dan verifikasi mereka yang kuat akan bersinar. Praktik terbaik menurut saya, sedangkan orang-orang mysql tidak benar-benar menghabiskan bandwidth mental untuk itu. Saya semua untuk melakukan sebanyak mungkin di mysql. Tapi tidak pernah topik ini, menggunakan hash. Biarkan PHP mendorong yang satu ini.
Skema
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');
Seiring datangnya gagasan, hei, saya ingin hash yang aman sekarang. Saya mungkin diretas.
-- 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 untuk mengulang dan memperbarui kolom baru yang dimaksudkan untuk membersihkan sebelum tidak memiliki konsep hash (yang saya pikir kita semua telah melihat 1 juta kali di tumpukan)
PHP untuk menambal:
<?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();
}
?>
Jalankan script php, verifikasi hasil. Itu milikku, milikmu akan berbeda. Anda bahkan akan berbeda dari Anda jika Anda menjalankannya lagi. Alasan disebutkan dalam kode.
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 |
+----+-------------+---------------------+--------------------------------------------------------------+