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_BCRYPT
、PASSWORD_ARGON2I
、および PASSWORD_ARGON2ID
はサポートされている引数です。
PASSWORD_BCRYPT
は CRYPT_BLOWFISH
アルゴリズムを使用し、PASSWORD_ARGON2I
は Argon2i
ハッシュアルゴリズムを使用し、PASSWORD_ARGON2ID
は Argon2id
ハッシュアルゴリズムを使用します。各アルゴリズムがどのように機能するかをよりよく理解するには、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_DEFAULT
と PASSWORD_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 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