sql >> データベース >  >> RDS >> Mysql

データベースのすべての行をハッシュ値で更新します

    まず、データベースに機密性の低いデータがある場合、組み込みのmysql関数を使用すると、mysqlだけを使用してupdateステートメントを使用してハッシュの結果を直接取得できると言わなければなりません。

    この答えはそれについてではありません。パスワードなどの機密データに関するものです。

    PHPのpassword_hash()へのリンクを提供しました およびpassword_verify() 例。

    こちらがそのリンク です また。左側のリンクはPDO用です。次のここにリンク mysqliの場合も同様です。

    PDOリンクで行を見てください

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

    したがって、ctPasswordというクリアテキストを含む列があるとします。 。 alter tableします hashedPasswordのような新しい列を追加します 。私が提供したリンクをたどり、それに応じて微調整し、ctPasswordの値をハッシュします hashedPasswordに 更新ステートメント付き。

    次に、徹底的にテストします。世界ですべてが正しければ、ドロップ ctPassword 列と二度とそれを使用することはありません。 明確にする 、データベースにクリアテキストのパスワードを保存しないでください。一方向のハッシュ値を保存し、それらに対して検証します。上記のリンクはその方法を示しています。

    編集

    これは完全にPHPからのものであり、mysqlハッシュ関数とは対照的に、これを駆動する必要があると思います。結局のところ、あなたはPHPを使用しており、その堅牢なハッシュと検証が輝いています。私の意見ではベストプラクティスですが、mysqlの人々はそれに精神的な帯域幅を正確に費やしていません。私はすべて、mysqlで可能な限り多くのことを行っています。しかし、ハッシュを使用して、このトピックは決してありません。 PHPにこれを駆動させます。

    スキーマ

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

    それに沿って、ねえ、私は今安全なハッシュが欲しいという概念があります。ハッキングされる可能性があります。

    -- 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がループして新しい列を更新し、ハッシュの概念がなくなる前にクリーンアップすることを目的としています(スタックで100万回見たことがあると思います)

    パッチ適用用のPHP:

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

    phpスクリプトを実行し、結果を確認します。それらは私のものです、あなたの 異なる。もう一度実行すると、あなたのものとはさらに異なります。コードに記載されている理由。

    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. PHPの未定義の変数mysqli接続

    2. MySQL初心者向けのDevOpsデータベース用語集

    3. 郵便番号の指定された距離内にあるすべての郵便番号を検索します

    4. MySQL全文検索でスペルミスに対処するための最良の方法