Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perbarui Semua Baris di Basis Data dengan nilai hash

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa MySQL tidak menggunakan salah satu dari kemungkinan kunci ini?

  2. Cara Menemukan Jumlah Hari Antara Dua Tanggal di MySQL

  3. Cara Membuat Database di MySQL Workbench menggunakan GUI

  4. Ketersediaan pemesanan MySQL, rentang tanggal yang tumpang tindih

  5. Cara Mendapatkan Total Pengguna Kumulatif Per Hari di MySQL