データベースにパスワードを挿入するときにパスワードのハッシュ

Xp10d3:

私は、パスワードハッシュがどのように機能するかについて混乱しています。私は$塩のものとPASSWORD_DEFAULTを理解していません。私はそれに少しアップ読んだが、まだそれは私のコードにどのように適合するかを理解していません。それが私の唯一のオプションのように感じたので、私はここに来ました。基本的に私は、データベースに挿入されたパスワードを持っている(私は合理的であることを理解する)パスワードをハッシュする何回も言われているが、私はそれがどのように動作するかについて混乱しています。私はそれを行う方法があることを見てきました:

$hash = hash($password_variable . $idk_what_this_is);

私が使用してデータベースにパスワードを挿入するよりも、私がいることを理解するであろう:

$sql = "INSERT INTO dont (STR, USERNAME, PASSWORD, EMAIL) VALUES ('$key', '$username', '$hash', '$email')";

しかし、私はパスワードの変更を取得する方法、それがどのように動作するかについて、主に混乱し、私はデータとするバック第二のデータベースに挿入することをGETよりも、データベースにデータを挿入するつもりですので、2番目のパラメータはコードでありますよそして、ユーザがそのデータを提出したかどうかをチェックするよりも。

sendemail.php

<?php
    /* Sends an email to the user and adds the special key to another database */
    $username = $_GET['username']; /* Gets the username that was submitted in the HTML form. */
    $password = $_GET['password']; /* Gets the password that was submitted in the HTML form. */
    $email = $_GET['email']; /* Gets the email that was submitted in the HTML form. */
    $servername = "localhost"; /* MySQL database. Change if needed! Most of the time its not localhost unless you're hosting on your computer. */
    $user = 'usernamelol'; /* MySQL username. Change if needed. */
    $pass = 'passwordlol'; /* MySQL password. Change if needed. */
    $dbname = 'vibemcform'; /* MySQL database name. Change if needed. */

    $bytes = random_bytes(10); /* Randomized code */
    $key = bin2hex($bytes); /* Makes the randomized code */

    $con = new mysqli($servername, $user, $pass, $dbname); /* Connects to the database */
    $query = mysqli_query($con, "SELECT * FROM `data` WHERE USERNAME='".$username."'"); /* Gets the username that was submitted */
    if (mysqli_num_rows($query) > 0) { /* If the username exists... */
            echo "ERROR: Username already exists. Please try again.";
            $con -> close();
            exit;
    } else { /* If the username DOESN'T exist... */
        try {
            $conn = new PDO("mysql:host=$servername;dbname=$dbname", $user, $pass);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO dont (STR, USERNAME, PASSWORD, EMAIL)
            VALUES ('$key', '$username', '$password', '$email')"; /* Insert all the data to the database */
            $conn->exec($sql);
        }
        catch(PDOException $e) {
            echo $sql . "<br>" . $e->getMessage();
        }
    }

    $conn = null;
    $msg = "localhost/vibemcform/verify.php?str=". $key . " Please verify your email!";
    $msg = wordwrap($msg,70);
    /*
    $headers = array("From: [email protected]",
        "X-Mailer: PHP/" . PHP_VERSION
    );
    */
    if (mail($email,"Verify your email",$msg/*, $headers*/)) {
        echo 'Message accepted! Check your email to verify your account. ';
    } else {
        echo 'Message not accepted. Contact the owner of the website! ';
    }
    echo 'Username submitted: ' . $username . ' Password submitted: ' . $password . ' Email submitted: ' . $email . ' .'; exit;
?>
ジェイ・ブランチャード:

ハッシュは、まず最初に隠されたまたは解読不能とするために別のもののために一つのことの置換です。あなたがアルファベットを書いた後、アルファベットは後方にあることで、あなたの最初の下に別の行を書いたときは、おそらく子供のように、あなたの最初のハッシュ、双方向の暗号を作成しました。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBA

「Z」今「A」であり、我々は我々の友人にコード化されたメッセージを送信することができ、彼らはそれらをデコードすることができます!私たちはどのように賢いです?!?!私たちは、妹が総ツリーハウス支配のための我々の計画をfoiling、私たちのコード化されたノートを傍受し、それらを翻訳し始めたとき、我々はすべての賢いじゃない見つけます。私たちは、ハッシュを修正する方法を見つける必要があります。どのように修正を作るのですか?私たちは、塩を追加します!

塩は、それをより安全にするために、私たちのハッシュを変更し、追加の入力として使用されるいくつかのデータです。私たちは、3「によってシフト」に私たちの友人に教えたり多分私達は、シフトを示すメッセージ内の数字のどこかにあります。突然、私たちのハッシュはもう少し複雑です。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
CBAZYXWVUTSRQPONMLKJIHGFED

「C」は今全体の後方のアルファベットで「A」は3つの文字をシフトしています。現実の世界での塩の目標は、辞書と虹のテーブルの攻撃のようなものから身を守ることです。password_hash()各パスワードのランダムな塩を作成します。

最後に、塩およびハッシュ法所定のハッシュを実行するアルゴリズムコストを指すコストがあります。私たちの友人ボビーはアルファベットで本当に良かったので、彼は暗号化されたノートを作りを担当していました。彼が二度(再びシフトとシフト)暗号化を行った場合、それは時間と労力の両方で、ハッシュのコストを倍増しました。三回は、コストを3倍にし、上のようになります。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
CBAZYXWVUTSRQPONMLKJIHGFED
FEDCBAZYXWVUTSRQPONMLKJIHG

'F' は今や 'A' です。それははるかに安全ですが、メッセージを解読するために長すぎる生成するのに時間がかかりすぎるとあれば、それは価値がある、それはなかったかもしれません。私たちのコンピュータやサーバの場合、コストははるかに複雑であるが、多くの場合、我々はコストの要因に関連した値を設定するオプションがあります。それは正しい、バランス、スピード対の努力を取得するには、いくつかの微調整を取り、最高の専門家に委ねられています。

PHPのpassword_hash()関数は、けれども、双方向の暗号を行っていない、それは一方向のみです。あなたは逆の上の秘密に私たちの試みとは異なり、パスワードを把握してハッシュを設計することはできません。

あなたがデフォルトのオプションを使用する場合はpassword_hash()、関数PHPそれはハッシュ化された各パスワードのランダムな塩を生成します。ランダムな塩は、それは非常に難しい任意のパスワードを解読することができ、追加のセキュリティ層です。2人以上のユーザーが同じパスワードを使用する場合でも、そのハッシュのそれぞれが異なることになります。

私たちが登録した最初の人はアダム・ウェスト、1960年代のテレビシリーズからバットマンです。彼は、ユーザー名「bwayne」を望んでいるし、彼のパスワードは「私はバットマンです!」(予告パスワードフレーズで、はるかに良いあなたが過去に使用した可能性のある標準のパスワードよりも、スペースを含みます。)。私たちのスクリプトで何も間違っているがある場合、エントリは、スムーズに行きます。

登録する次の人は、1989年映画のマイケル・キートン、バットマンです。彼は別のユーザー名を使用しますが、自分のパスワードはまったく同じです。

私はバットマンです!

PHPが提供するランダム塩がとても便利になるのはここです。パスワードが同じであっても、各ハッシュは完全に異なっています。

ここでは、画像の説明を入力します。

そのため、暗号化の種類のパスワードが一致の最初の数文字を関与が、すべては、それらの文字を超えて異なるとユニークです。これらのいくつかの文字はに指示password_verify()されたアルゴリズムは、ハッシュを使用しました。このアルゴリズムは、の2番目のパラメータとして指定されていますpassword_hash()この答え$idk_what_this_is

$hash = hash($password_variable . $idk_what_this_is);

注:私たちは、バットマンが本当に誰であるかの細かい点に取得する必要はありませんが、我々は彼らに両方行くのバックを持っているし、テストが完了したら、自分のパスワードを変更でした。.....えー、ええと.....それらをBatcaveの場所を知っているが、私たちに誰も必要としません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=28038&siteId=1