PHP でのパスワードハッシュ

Olorunfemi Akinlua 2023年1月30日
  1. PHP でのパスワードハッシュ
  2. PHP でのパスワードハッシュには password_hash()password_verify() を使用する
PHP でのパスワードハッシュ

PHP はサーバー側の開発に使用され、ログインおよび登録プロセスを構築するときにパスワードが必要になります。セキュリティとプライバシーの問題のために、パスワードをハッシュ化して、誰も(あなたとあなたのデータベース管理者を含む)ユーザーのパスワードを知ることができないようにする必要があります。

ただし、パスワードをハッシュする場合は、ログインするときに再ハッシュする必要があります。この記事では、パスワードのハッシュと、PHP の組み込み関数 password_hash() および password_verify() の使用方法について詳しく説明します。。

PHP でのパスワードハッシュ

ユーザーから収集されたデータはデータベースに保存され、データベースにアクセスできる人なら誰でも見ることができます。多くの場合、ユーザー名とアドレスはそのまま残されます。それらはあなたのアカウントの鍵ほど重要ではありません。

ユーザーのパスワードであるテキストの文字列は、ハッシュアルゴリズム(bcrypt、md5、sha-1、sha-2)を介して渡され、パスワードがそのまま保存されないようにし、テキストのスクランブル表現を作成します。このパスワードのスクランブル表現が保存され、ログインプロセス中に、スクランブル表現が比較されます。

組み込みの password_hash() 関数は、Auth0 が推奨するクライアントベースに使用する bcrypt アルゴリズムを利用します。また、password_verify() 関数は、パスワードテキストをハッシュと比較し、パスワードがハッシュと一致するとブール値を返します。

PHP でのパスワードハッシュには password_hash()password_verify() を使用する

ユーザーがサイトにアクセスして新しいアカウントを作成すると、PHP 開発者として、アプリケーションがパスワードをハッシュするようになります。そのために、password_hash() 関数を適用します。

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

コードスニペットの出力は次のとおりです。

$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.

コードスニペットはデフォルトのハッシュアルゴリズムを使用します。これは、PHP のドキュメントによると、bcrypt アルゴリズムを使用します。ハッシュアルゴリズムを変更する場合は、関数の 2 番目の引数を変更できます。

使用できる他の 3つの可能な引数(ハッシュアルゴリズム)があります。PASSWORD_BCRYPTPASSWORD_ARGON2I、および PASSWORD_ARGON2ID はサポートされている引数です。

PASSWORD_BCRYPTCRYPT_BLOWFISH アルゴリズムを使用し、PASSWORD_ARGON2IArgon2i ハッシュアルゴリズムを使用し、PASSWORD_ARGON2IDArgon2id ハッシュアルゴリズムを使用します。各アルゴリズムがどのように機能するかをよりよく理解するには、PHP パスワードハッシュドキュメントを確認してください。

コードで PASSWORD_BCRYPT パラメーターを試してみましょう。

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

コードスニペットの出力は次のとおりです。

$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO

PASSWORD_DEFAULTPASSWORD_BCRYPT はどちらも $2y$ 識別子を使用し、60 文字の文字列を生成します。上記のプロセスにより、ユーザーのパスワードを正常にハッシュできました。

ここで、ユーザーが自分のアカウントにログインしたい場合は、入力したパスワードをハッシュされたパスワードと比較する必要があります。そこで、password_verify() が登場します。

パスワードと保存されているハッシュパスワードを組み込み関数で比較できます。

<?php

$password = "24FE21121@1*?";
$hashed_password ='$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.';

print_r(password_verify($password, $hashed_password));

?>

コードスニペットの出力は次のとおりです。

1

PHP では、1 は true を表し、0 は false を表します。

PASSWORD_BCRYPT パラメータによって生成されたハッシュされたパスワードに対して password_verify() 関数を試してみましょう。

<?php

$password = "24FE21121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

print_r(password_verify($password, $hashed_password));

?>

コードスニペットの出力は次のとおりです。

1

password_verify() 関数が使用するハッシュパスワードに関係なく機能する理由は、関数が crypt() と互換性のある指定されたハッシュ一致を検証するためです。また、関数は返されたハッシュの一部としてアルゴリズム、コスト、およびソルトを返し、タイミング攻撃に対して安全です。

ハッシュ結果を改善するには、password_hash() 関数でコストとソルトのオプションを指定します。ただし、使い方がわからない場合は、セキュリティに大きな影響を与える可能性があります。

password_verify() 関数が間違ったパスワードをキャッチするかどうかを確認するには、間違ったパスワードを設定します(24FE21121@1*? から 24Fqqw1121@1*? に変更します)。

<?php

$password = "24Fqqw1121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

if (password_verify($password, $hashed_password)) {
    echo "Password Matches!";
} else {
    echo "Wrong Password";
}

?>

コードスニペットの出力は次のとおりです。

Wrong Password

実際のログインプロセスのコンテキスト内で使用すると、コードは次のようになります。

<?php
$connect = mysqli_connect($localhost, $username, $password, $database);

if (isset($_POST['submit'])) {
    extract($_POST);

    // retrive stored hashed password
    $sqlQuery = mysqli_query($connect, "SELECT * FROM USERTABLE WHERE USER='$username'");
    $fetch = mysqli_fetch_array($sqlQuery);
    $currentPassword = $fetch['hashPassword'];

    if (password_verify($enteredPassword, $currentPassword)) {
        // password matches
        $_SESSION['id'] = $fetch['id'];
        header("location: home.php");
    } else {
        // password doesn't match
        $output = "Wrong Passworfd";
    }
}
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - PHP Password