新しいAPIを使用したPHP 5.5でのパスワードハッシュ

BCryptを使用することは、パスワードをハッシュするための一般的に受け入れられている最良の方法ですが、多くの開発者はまだMD5やSHA1などの古くて弱いアルゴリズムを使用しています。 一部の開発者はハッシュソルトさえ使用していません。 PHP 5.5の新しいハッシュAPIは、BCryptに注意を向けることを目的としており、操作が簡単になります。 この記事では、PHPで新しいハッシュAPIを使用する基本を紹介します。



新しいパスワードハッシュAPIは、次の4つの単純な機能を提供します。





password_hash()



crypt()関数かなり安全ですが、多くの人が複雑すぎると考えています。 一部の開発者は、弱塩と弱アルゴリズムを使用してハッシュを生成します。

<?php $hash = md5($password . $salt); // works, but dangerous
      
      





しかし、 password_hash()関数を使用すると、生活を簡素化してコードを保護できます。 パスワードハッシュを取得する必要がある場合は、この関数に入力するだけで、データベースに保存できるハッシュが返されます。

 <?php $hash = password_hash($passwod, PASSWORD_DEFAULT);
      
      





以上です! 最初のパラメーターはハッシュされるパスワード文字列で、2番目のパラメーターはハッシュの生成に使用されるアルゴリズムを決定します。



現在、デフォルトのアルゴリズムはBCryptですが、将来的にはデフォルトでより強力なアルゴリズムがインストールされる可能性があり、おそらく大きな文字列が生成されます。 プロジェクトでPASSWORD_DEFAULTを使用する場合は、60文字を超える列にハッシュを保存してください。 列サイズを255に設定することをお勧めします。 PASSWORD_BCRYPTを2番目のパラメーターとして使用することもできます。 この場合、結果は常に60文字になります。



ここでの主なことは、saltの値とハッシュ計算のコストを心配する必要がないことです。 新しいAPIがこれを行います。 また、塩はハッシュの一部であるため、個別に保存する必要はありません。 独自のソルト(または計算のコスト)を使用する場合、3番目の引数を関数に渡すことでこれを実行できます。

 <?php $options = [ 'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt 'cost' => 12 // the default cost is 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options);
      
      





したがって、常に最新のセキュリティ対策を講じることができます。 PHPが後でより強力なハッシュアルゴリズムを使用することに決めた場合、コードはそれを変更せずに使用できます。



password_verify()



新しいAPIを使用してハッシュを生成する方法を確認したので、パスワードを確認する方法を見てみましょう。 データベースからハッシュとユーザーが入力したパスワードを取得し、この関数に渡します。 password_verify()は、ハッシュが指定されたパスワードと一致する場合にtrueを返します。

 <?php if (password_verify($password, $hash)) { // Success! } else { // Invalid credentials }
      
      





ソルトはハッシュの一部であるため、別に気にする必要はありません。



password_needs_rehash()



保存したパスワードのソルトまたは計算コストを変更する必要がある場合はどうなりますか? たとえば、セキュリティを強化し、コンピューティングのコストを上げるか、ソルトを変更することにします。 または、PHPがデフォルトのハッシュアルゴリズムを変更しました。 このような場合、既存のパスワードハッシュを変更します。 password_needs_rehash()関数は、パスワードハッシュが特定のアルゴリズム、ソルト、および計算コストを使用しているかどうかを確認します。

 <?php if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { // the password needs to be rehashed as it was not generated with // the current default algorithm or not created with the cost // parameter 12 $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // don't forget to store the new hash! }
      
      





暗号化されていないパスワードにアクセスできるのはこれだけであるため、ユーザーがサイトにログインするときにこれを行う必要があることに注意してください。



password_get_info()



password_get_info()関数はハッシュを受け入れ、3つの要素の連想配列を返します。





おわりに



新しいパスワードハッシュAPIは、 crypt()を使用するよりも確かに便利です。 サイトで現在PHP 5.5を実行している場合は、新しいハッシュAPIを使用することを強くお勧めします。 PHP 5.3.7(またはそれ以降)を使用しているユーザーは、 password_compatというライブラリを使用できます 。このライブラリは、このAPIをエミュレートし、PHPバージョン5.5以降を使用すると自動的に無効になります。



オリジナル。



All Articles