本記事では「password_hash」関数を利用した安全なパスワードハッシュを生成する方法を紹介しています。
PHPで安全なパスワードハッシュを生成する方法
パスワードを安全に管理するためには、ソルトとストレッチングを用いてハッシュ値(暗号学的ハッシュ関数)としてデータベースに保存しておく必要があります。
このソルトとストレッチングを実施してハッシュ値を生成してくれるパスワードハッシュアルゴリズムには、「bcrypt」などが存在します。
そして、PHPには「password_hash」というパスワードハッシュを生成する関数が用意されています。
password_hash関数
password_hash関数を利用することで、安全なパスワードハッシュを生成することができます。
ソルトはオプションで指定することもできますが、ソルトを省略すれば、安全なソルトをこの関数が自動的に生成してくれます。
password_hash関数の引数は次の通りです。戻り値はハッシュ値の文字列が返却されます。
| 引数 | 型 | 説明 |
| 第一引数 | string | パスワードの文字列 |
| 第二引数 | int | 使用するハッシュアルゴリズム |
| 第三引数 | array | 任意のオプション(ソルトとアルゴリズムのコスト) |
ハッシュアルゴリズムの指定
第二引数のハッシュアルゴリズムは次の4パターンから指定します。
| ハッシュアルゴリズム | 説明 |
| PASSWORD_DEFAULT | bcryptアルゴリズムを使用。(PHP 5.5.0 の時点でのデフォルト)。新しくてより強力なアルゴリズムが PHP に追加されれば、 この定数もそれにあわせて変わっていく |
| PASSWORD_BCRYPT | bcryptアルゴリズムを使用 |
| PASSWORD_ARGON2I | Argon2i ハッシュアルゴリズムを使用 |
| PASSWORD_ARGON2ID | Argon2id ハッシュアルゴリズムを使用 |
ハッシュアルゴリズムを指定する実装例と実行結果は次の通りです。
【実装例】
$password = "password12345";
echo "PASSWORD_DEFAULT:".password_hash($password, PASSWORD_DEFAULT). "<br>";
echo "PASSWORD_BCRYPT:".password_hash($password, PASSWORD_BCRYPT). "<br>";
echo "PASSWORD_ARGON2I:".password_hash($password, PASSWORD_ARGON2I). "<br>";
echo "PASSWORD_ARGON2ID:".password_hash($password, PASSWORD_ARGON2ID). "<br>";
オプションの指定
ハッシュアルゴリズム「PASSWORD_BCRYPT」がサポートするオプションは次の通りです。
| オプション名 | 説明 |
| salt | パスワードのハッシュに使うソルトを手動で設定。PHP 7.0.0 から非推奨のオプションであり、このオプションは指定せずに、デフォルトで生成されるソルトを使うことを推奨している |
| cost | 利用するアルゴリズムのコスト(ストレッチング回数)を示す |
手動のソルトを指定
オプションで「ソルト」を指定する実装例と実行結果は次の通りです。
【実装例】
$password = "password12345";
$options = [
'salt' => "mOqouj.7VRXjNci58C1xKu",
];
echo password_hash($password, PASSWORD_BCRYPT, $options);
アルゴリズムのコストを指定(ストレッチング回数)
オプションで「アルゴリズムのコスト」を指定する実装例と実行結果は次の通りです。
【実装例】
$password = "password12345";
$options = [
'cost' => 11,
];
echo password_hash($password, PASSWORD_BCRYPT, $options);
手動のソルトとアルゴリズムのコスト(ストレッチング回数)を指定
オプションで「ソルト」と「アルゴリズムのコスト」を指定する実装例と実行結果は次の通りです。
【実装例】
$password = "password12345";
$options = [
'cost' => 12,
'salt' => "mOqouj.7VRXjNci58C1xKu",
];
echo password_hash($password, PASSWORD_BCRYPT, $options);
password_verify関数
password_verify関数は、引数に指定した「平文」と「パスワードハッシュ」が一致するかを確認するための関数です。
password_verify ( string $password , string $hash ) : bool
第一引数に平文のパスワード、第二引数にpassword_hash関数が作ったハッシュ値を指定します。
「password_hash」関数と「password_verify」関数を使った実装例は次の通りです。
【実装例】
$password = "password12345";
$hashed = password_hash($password, PASSWORD_DEFAULT);
if(password_verify($password, $hashed)) {
echo 'パスワードは一致';
} else {
echo 'パスワードは一致しない';
}
【実行結果】
パスワードは一致
学習書の紹介
PHP本格入門[下] 〜オブジェクト指向設計、セキュリティ、現場で使える実践ノウハウまで [ 大家正登 ] 価格:3938円 |
PHP本格入門[上] 〜プログラミングとオブジェクト指向の基礎からデータベース連携まで [ 大家正登 ] 価格:3938円 |
Webアプリケーションの定番言語であるPHPの基礎から実践までを、上下巻のフルボリュームで集大成。
「この目的を実現するためには、どの文法テクニックが適合しやすいだろう?」
「このプログラムをより読みやすくするために、どんなアプローチができるだろう?」
といったことを思考しつつ、「とりあえずは動く」だけで終わらない、現場に求められる品質を形にするための知識とテクニックを解説されています。
PHPを学習されている方のお力になれれば幸いです。