昨日リリースされた PHP 5.5.0 には、新機能の包括的なリストが含まれています。新しい API の 1 つは、パスワード ハッシュ API です。これには、password_get_info()、password_hash()、password_needs_rehash()、password_verify() の 4 つの関数が含まれています。各関数を段階的に理解してみましょう。
まず、password_hash() 関数について説明します。これは新しいパスワードを作成するためのハッシュ値として使用されます。これには、パスワード、ハッシュ アルゴリズム、オプションの 3 つのパラメータが含まれます。最初の 2 つの項目は必須です。この関数は次の例に従って使用できます:
1 | $password = 'foo'; |
2 | $hash = password_hash($password,PASSWORD_BCRYPT); |
3 | //y$uOegXJ09qznQsKvPfxr61uWjpJBxVDH2KGJQVnodzjnglhs2WTwHu |
このハッシュにはオプションを追加していないことがわかります。利用可能なオプションは現在、コストとソルトの 2 つに制限されています。オプションを追加するには、連想配列を作成する必要があります。
1 | $options = [ 'cost' => 10, |
2 | 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) ]; |
このオプションをpassword_hash()関数に追加すると、ハッシュが変更され、より安全になります。
1 | $hash = password_hash($password,PASSWORD_BCRYPT,$options); |
2 | //y$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22 |
ハッシュが作成されたので、password_get_info() を通じて新しいハッシュ値に関する情報を表示できます。 password_get_info() は 1 つの引数 (ハッシュ値) を取り、アルゴリズム (使用されるハッシュ アルゴリズムの整数表現)、アルゴリズム名 (使用されるハッシュ アルゴリズムの人間が判読できる名前)、および使用したオプションを含むパラメーターを返します。値オプションのハッシュ連想配列を作成します)。
01 | var_dump(password_get_info($hash)); |
02 | /* |
03 | array(3) { |
04 | ["algo"]=> |
05 | int(1) |
06 | ["algoName"]=> |
07 | string(6) "bcrypt" |
08 | ["options"]=> |
09 | array(1) { |
10 | ["cost"]=> |
11 | int(10) |
12 | } |
13 | } |
14 | */ |
パスワード ハッシュ API に最初に追加されるのは、password_needs_rehash() です。これは、ハッシュ、ハッシュ アルゴリズム、およびオプションの 3 つのパラメータを受け入れます。最初の 2 つは必須です。 passwd_needs_rehash() は、ハッシュ値が特定のアルゴリズムとオプションを使用して作成されたかどうかを確認するために使用されます。これは、データベースが破損しており、ハッシュを調整する必要がある場合に役立ちます。各ハッシュ値をpassword_needs_rehash()でチェックすることで、既存のハッシュ値が新しいパラメータと一致するかどうかを確認でき、古いパラメータで作成された値のみが影響を受けます。
最後に、ハッシュを作成し、その作成方法を調べ、再ハッシュする必要があるかどうかを確認しました。次に、それを検証する必要があります。プレーン テキストをハッシュ値と照合するには、password_verify() を使用する必要があります。これは、パスワードとハッシュ値の 2 つのパラメータを受け取り、TRUE または FALSE を返します。取得したハッシュが正しいかどうかを確認してみましょう。
1 | $authenticate = password_verify('foo','y$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22'); |
2 | //TRUE |
3 | $authenticate = password_verify('bar','y$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22'); |
4 | //FALSE |
上記の知識があれば、新しい PHP 5.5.0 バージョンでハッシュ パスワードを迅速かつ安全に作成できます。