0Pricing
PHP Academy · レッスン

パスワードの安全な保存

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 login

password_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); // true

Laravelでの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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クロスサイトスクリプティング(XSS)の防止
  2. SQLインジェクションとパラメータ化クエリ
  3. CSRF対策
  4. パスワードの安全な保存
← PHP Academyに戻る