だから、PHP 7.2は新しい Argon2アルゴリズム を導入した。
$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]);
PASSWORD_DEFAULT
はArgon2を使用するようになりましたか? password_verify
で変更する必要があるものがある場合、それは何ですか? bcryptは現在安全ではないと見なされていますか?
PHP 7.2より前では、使用されるハッシュアルゴリズムpassword_hash
はbcryptのみでした。この記事の執筆時点では、bcryptは、特にその先行バージョンであるmd5
およびsha1
(どちらも高速であるため 安全ではありません )。Argon2は 単純にブルートフォースに対して高価なアルゴリズムです
Argon2iは、データに依存しないメモリアクセスを使用します。トレードオフ攻撃から保護するためにメモリをより多くパスするため、処理速度は遅くなります。パスワードハッシュとパスワードベースのキーの派生に強くお勧めします。
Bcryptは依然としてパスワードの受け入れ可能なハッシュです。必要ない場合は切り替える必要はありません(7.2.0リリース以降)。また、PASSWORD_DEFAULT
は、次の完全リリース(7.3.0以降)でのみ( PHP内部ポリシー ごと)に変更する必要があります。 bcryptのみで続行するようにしたい場合は、代わりにPASSWORD_BCRYPT
を使用できます。ただし、以下で説明するように、これは不要です。
最初に、password_hash
の2番目の引数をこれらの定数の1つに切り替えます
PASSWORD_ARGON2I
-PHP 7.2.0+PASSWORD_ARGON2ID
-PHP 7.3.0+(利用可能な場合は推奨、下記の注を参照)その後、オプションを変更する必要があります。 bcryptは、cost
をパスワードの繰り返し回数のパラメーターとして使用します(コストが高い=ハッシュ時間が長くなります)。ただし、さまざまなコスト要因があります
password_hash('somepassword', PASSWORD_ARGON2I, ['memory_cost' => 2048, 'time_cost' => 4, 'threads' => 3]);
マニュアルから これらのオプションが何をするのかがわかります
memory_cost
-Argon2ハッシュの計算に使用できる最大メモリ(バイト単位)(デフォルトは1024)time_cost
-Argon2ハッシュの計算にかかる最大時間(デフォルト2)threads
-Argon2ハッシュの計算に使用するスレッドの数(デフォルト2)これらを変更する前に、ここでのより高いコストがスクリプトの速度を低下させることを理解してください。サーバーでテストを実行して、最適な設定を見つけることをお勧めします。これは通常、特定のコストの複数の反復をループすることによって行われます。 PHPマニュアルには、必要に応じてthis の例が記載されています。
また、bcryptは60文字を格納しますが、Argon2はそれ以上を必要とする可能性があることに注意してください。理想的には、パスワードフィールドに255文字を保存する必要があります。
password_verify
で何を変更しますか?ここでの答えは...何もありません。 password_verify
は、使用されているアルゴリズムを把握して適切に処理するのに十分なほどスマートであることを理解してください。上記のように、これはPASSWORD_DEFAULT
を使用している場合、デフォルトが変更され、悪影響を及ぼさないことを意味します(ただし、コストパラメーターを調整する必要がある場合があります)。 password_verify
は、サポートするアルゴリズムを単に必要とします。 bcryptからArgon2に切り替えると、必要なすべてのデータ(塩、ハッシュ、コスト)が自動的に保存されるため、両方とも同じ方法で検証されます。
//Works for both bcrypt and Argon2
if(password_verify($user_password, $stored_hash)) {
// password validated
}
ハッシュをbcryptからアップグレードする場合、ユーザーが正常にログインしたときにハッシュをアップグレードできます(したがって、ハッシュされていないパスワードが提供されます)。ハッシュが$2y$
(bcryptマーカー)で始まるかどうかを確認するだけです。存在する場合、提供されたパスワードをpassword_hash
に再度渡しますが、Argon2引数を使用して、ログインしたユーザーのパスワードフィールドに保存します。
PHP 7.3 )で導入されたArgon2IDは、この Crypto.SEの質問
1パスArgon2idの最良のトレードオフ攻撃は、低ストレージ攻撃(メモリの前半)とランキング攻撃(後半)を組み合わせたもので、約2.1の係数をまとめています。
Argon2IDは、Argon2Iと同じ引数で機能します。