関数辞典

🔧 password_hash()

password_hash() — 安全なパスワードハッシュ生成

シグネチャ

password_hash(string $password, string|int|null $algo, array $options = []): string
引数 1
string $password
引数 2
string|int|null $algo
引数 3
array $options = []
戻り値
string

解説

パスワードを安全にハッシュ化します。`PASSWORD_DEFAULT` を使えば PHP のバージョンに応じた最新アルゴリズム(現在は bcrypt)が使われます。 検証は `password_verify()` を使います。md5/sha1 は使わないこと (= 衝突耐性なし + 高速計算で総当たり攻撃に弱い)。 salt は自動で付与されるためコード側で salt を扱う必要はありません。

使用例

<?php
$hash = password_hash('user-password', PASSWORD_DEFAULT);
if (password_verify('user-password', $hash)) {
    echo 'ログイン成功';
}

// アルゴリズム更新の必要があるかチェック
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    $hash = password_hash('user-password', PASSWORD_DEFAULT);
    // DB を更新
}

よくある用途

1. ユーザー登録時のパスワード保存。 2. ログイン時のパスワード照合 (= password_verify と組で)。 3. API key / セッショントークンのハッシュ化 (= ただし用途次第で HMAC が良い)。

落とし穴 / 注意点

❌ ハッシュ値の長さは 60 文字 (bcrypt) なので DB のカラムは VARCHAR(60) ではなく VARCHAR(255) を推奨 (= 将来のアルゴリズム変更で長くなる可能性)。 ❌ bcrypt は 72 バイトまでしか入力を見ません (= それ以降は無視される)。 長いパスフレーズを使う場合は事前に hash_hmac() で圧縮するか、 Argon2 系を選びます。 ❌ password_verify() は constant-time 比較なのでタイミング攻撃に強い (= == や === での比較は NG)。 ❌ アルゴリズム変更後は password_needs_rehash() で再ハッシュが必要かを確認し、 ログイン成功時に更新するのが王道です。 ❌ md5 / sha1 / sha256 単体 + 自前 salt は古い設計で 推奨されません。

代替手段・関連関数

・PASSWORD_ARGON2ID (= Argon2id) — PHP 7.3+ で使える、 メモリ集約型で GPU 攻撃に強い (= cost や memory_cost を調整)。 ・libsodium の crypto_pwhash — Argon2 をより低レベルで制御。 ・外部 PaaS (= AWS Cognito / Firebase Auth) に認証を委譲してパスワードハッシュを自前で持たない。

公式マニュアル

https://www.php.net/manual/ja/function.password-hash.php