Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zaktualizuj wszystkie wiersze w bazie danych o wartość skrótu

Po pierwsze muszę powiedzieć, że jeśli masz niewrażliwe dane w bazie danych, to wbudowane funkcje mysql mogą dać ci wyniki skrótów bezpośrednio za pomocą instrukcji aktualizacji, używając tylko mysql.

Ta odpowiedź nie dotyczy tego. Chodzi o poufne dane, takie jak hasła.

Dałem ci link do PHP password_hash() i password_verify() przykład.

Oto Ten link ponownie. Ten link po lewej dotyczy PDO. Poniższy Link tutaj jest podobny i dla mysqli.

W linku PDO spójrz na linię

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

Załóżmy, że masz teraz kolumnę z czystym tekstem o nazwie ctPassword . Mógłbyś alter table i dodaj nową kolumnę dla czegoś takiego jak hashedPassword . Kliknij podany przeze mnie link, odpowiednio dostosuj, zahaszuj wartości ctPassword na hashedPassword z oświadczeniem o aktualizacji.

Następnie dokładnie przetestuj. Kiedy wszystko jest w porządku na świecie, upuść ctPassword kolumny i nigdy więcej jej nie używaj. Aby było jasne , nigdy nie przechowuj haseł w postaci zwykłego tekstu w bazach danych. Przechowuj jednokierunkowe wartości skrótu i ​​weryfikuj je. Powyższe linki pokazują, jak.

Edytuj

Tutaj jest w całości z PHP, z którego moim zdaniem należy to wyprowadzić, w przeciwieństwie do funkcji mieszających mysql, fuj. W końcu używasz PHP i właśnie tam zabłyśnie ich solidne hashowanie i weryfikacja. Według mnie najlepsze praktyki, podczas gdy ludzie z mysql nie poświęcają na to zbyt dużej przepustowości. Jestem za robieniem jak najwięcej w mysql. Ale nigdy w tym temacie, używając skrótów. Pozwól PHP sterować tym.

Schemat

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

Pojawia się myśl, hej, chcę teraz bezpiecznych haszy. Mogę zostać zhakowany.

-- 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, aby przejść przez pętlę i zaktualizować nową kolumnę, mającą na celu wyczyszczenie przed brakiem koncepcji mieszania (którą myślę, że wszyscy widzieliśmy 1 mln razy na stosie)

PHP do łatania:

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

Uruchom skrypt php, zweryfikuj wyniki. To moje, twoje będzie różnić się. Twój będzie się nawet różnił od twojego, jeśli uruchomisz go ponownie. Powód wymieniony w kodzie.

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. json_encode i highcharts

  2. Jak zrobić time_to_minute w Mysql?

  3. MySQL:Jak zezwolić na zdalne połączenie z mysql

  4. Nieprzechwycony wyjątek „PDOException” z komunikatem „SQLSTATE[HY093]:nieprawidłowy numer parametru”

  5. Neo4j - Utwórz wiązanie za pomocą Cypher