パスワードの安全な保存
password_hashでパスワードをハッシュ化し、password_verifyで検証します
「パスワードの安全な保存」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
平文のパスワードを保存しない
パスワードを平文で保存すると、データベースが侵害された際にすべてのユーザーのパスワードが露出します。必ず暗号学的ハッシュを保存してください。理想的にはbcrypt、Argon2id、またはscryptを使用します。
password_hash()
PHP組み込みのpassword_hash()は、出力にランダムなソルトを含む安全なハッシュを作成します。
<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)password_verify()
平文のパスワードを保存済みのハッシュと照合します。
<?php
$hash = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
echo "Correct password!";
}アルゴリズムの選択肢
PHPは次をサポートしています:
PASSWORD_BCRYPT— 広くサポートされており、72バイトの上限がありますPASSWORD_ARGON2I— メモリハード(PHP 7.2以降)PASSWORD_ARGON2ID— 推奨。GPU攻撃に強い(PHP 7.3以降)PASSWORD_DEFAULT— 現在はbcryptですが、将来のPHPバージョンで変更される可能性があります
コスト係数
コスト係数は、ハッシュ計算にかかる時間を制御します。コストが高いほど、総当たり攻撃に時間がかかります。bcryptのデフォルトのコストは10です。
<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for loginpassword_needs_rehash()
PHPをアップグレードした後やコスト設定を変更した後は、既存のハッシュを更新する必要があるか確認してください。
<?php
if (password_verify($plain, $storedHash) &&
password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}LaravelのHashファサード
Laravelはpassword_hashをHashファサードでラップし、デフォルトではbcryptを使用します。
<?php
use Illuminate\Support\Facades\Hash;
$hash = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // trueLaravelでのArgon2
config/hashing.phpでLaravelがArgon2idを使用するよう設定します。
// config/hashing.php
"driver" => "argon2id",ソルトの処理
最新のPHPハッシュ関数は、暗号学的に安全なランダムソルトを自動的に含めます。独自のソルト処理を実装しないでください。誤実装しやすいためです。
ペッパー(アプリケーションレベルの秘密情報)
データベースの外部に保存した追加の秘密情報(ペッパー)を、ハッシュ化の前に混ぜることができます。データベースが盗まれても、攻撃者はペッパーなしでは総当たり攻撃を行えません。
タイミングセーフな比較
password_verify()は内部で定時間比較を使用し、タイミング攻撃を防ぎます。ハッシュを==で比較しないでください。
概要
PASSWORD_DEFAULTまたはPASSWORD_ARGON2IDを指定してpassword_hash()を使用してください。password_verify()で検証します。必要に応じてログイン時に再ハッシュしてください。平文のパスワードを保存したり、パスワードにMD5/SHA1を使用したりしないでください。
確認問題
PHPが生成したハッシュに対してパスワードを検証する関数はどれですか?
よくある質問
「パスワードの安全な保存」レッスンは無料ですか?
はい。「パスワードの安全な保存」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「パスワードの安全な保存」で何を学びますか?
password_hashでパスワードをハッシュ化し、password_verifyで検証します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「パスワードの安全な保存」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。