Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cập nhật tất cả các hàng trong DataBase với một giá trị băm

Đầu tiên, tôi phải nói rằng nếu bạn có dữ liệu không nhạy cảm trong db, thì các hàm mysql tích hợp sẵn có thể cung cấp cho bạn kết quả băm trực tiếp với các câu lệnh cập nhật chỉ bằng cách sử dụng mysql.

Câu trả lời này không phải về điều đó. Đó là về dữ liệu nhạy cảm, như mật khẩu.

Tôi đã cung cấp cho bạn một liên kết đến một PHP password_hash()password_verify() ví dụ.

Đây là Liên kết đó lại. Liên kết bên trái đó là dành cho PDO. Liên kết ngay tại đây sau tương tự và đối với mysqli.

Trong liên kết PDO, hãy nhìn vào dòng

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

Vì vậy, giả sử bây giờ bạn có một cột với văn bản rõ ràng trong đó được gọi là ctPassword . Bạn sẽ alter table và thêm một cột mới cho một cái gì đó như hashedPassword . Theo liên kết mà tôi đã cung cấp, chỉnh sửa cho phù hợp, băm các giá trị của ctPassword thành hashedPassword với một tuyên bố cập nhật.

Sau đó kiểm tra kỹ lưỡng. Khi tất cả đều ổn trên thế giới, hãy thả ctPassword cột và không bao giờ sử dụng nó nữa. Để rõ ràng , không bao giờ lưu trữ mật khẩu văn bản rõ ràng trong cơ sở dữ liệu. Lưu trữ các giá trị băm một chiều và xác minh chúng. Các liên kết trên cho thấy cách thực hiện.

Chỉnh sửa

Đây là hoàn toàn từ PHP, nơi tôi nghĩ rằng điều này cần phải được thúc đẩy từ, trái ngược với các hàm băm mysql, yuck. Sau cùng, bạn đang sử dụng PHP, và chính ở đó, khả năng băm và xác minh mạnh mẽ của chúng sẽ tỏa sáng. Các phương pháp hay nhất theo quan điểm của tôi, trong khi những người dùng mysql không chính xác dành băng thông tinh thần cho nó. Tôi là tất cả để làm nhiều nhất có thể trong mysql. Nhưng không bao giờ là chủ đề này, sử dụng hàm băm. Hãy để PHP thúc đẩy điều này.

Lược đồ

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');

Cùng với khái niệm, này, tôi muốn băm an toàn ngay bây giờ. Tôi có thể bị tấn công.

-- 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 để lặp lại và cập nhật một cột mới có nghĩa là để dọn dẹp trước khi không có khái niệm băm (tôi nghĩ rằng tất cả chúng ta đã thấy 1 triệu lần trên ngăn xếp)

PHP để vá:

<?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();
    }
?>

Chạy tập lệnh php, xác minh kết quả. Đó là của tôi, của bạn sẽ khác nhau. Của bạn thậm chí sẽ khác với của bạn nếu bạn chạy lại. Lý do được đề cập trong mã.

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. Truy vấn SQL trả về tất cả các ngày không được sử dụng trong bảng

  2. Mệnh đề VỚI MySQL

  3. Tôi có thể tải xuống nguồn cho MySQL Connector / J ở đâu

  4. Eval () hiển thị giá trị tùy chỉnh nếu null

  5. groupby và count hoạt động như thế nào trong sql