PHPでパスワードのハッシュと検証を実行する場合、 Crypt()とPassword_verify()は、頻繁に言及された2つの関数です。それらはすべてパスワードセキュリティ処理を伴いますが、それらは異なる方法で使用され、さまざまな目的のために設計されています。したがって、開発者は次のように尋ねるかもしれません。
crypt()は、初期にパスワードを暗号化するためにPHPで使用される関数です。次のようなさまざまなアルゴリズムをサポートしています。
DES(デフォルト)
MD5( $ 1 $で始まる)
ブローフィッシュ( $ 2A $ 、 $ 2Y $などから始める)
Sha-256、Sha-512( $ 5 $ 、 $ 6 $から始まる)
典型的なCrypt()の使用は次のとおりです。
$password = 'mySecret';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
password_verify()は、php 5.5で導入された関数であり、 password_hash()を使用して生成されたハッシュを検証するために特別に設計されています。ハッシュ(Bcrypt、Argon2など)で使用されるアルゴリズムを自動的に識別し、入力されたPlantextパスワードに従って比較します。
if (password_verify('mySecret', $hashFromDatabase)) {
echo '正しいパスワード';
}
短い答え:推奨されず、意味がありません。
Password_verify()は実際にcrypt()と同様の基礎となるメカニズムを呼び出していますが、「家庭」関数Password_hash()によって生成されたハッシュ形式のみをサポートします。 crypt()を使用してハッシュをカスタマイズし、 password_verify()を使用して確認すると、次の問題が発生します。
ハッシュ形式がpassword_verify()の期待を満たしていない場合、falseを返します。
PHPは、将来のバージョンでCrypt()によって生成された非標準形式のハッシュのサポートを保証しません。
Password_verify()は、間違った形式のハッシュに対してまったく解析されない可能性があり、その結果、検証は常に失敗します。
言い換えれば、 2つは関連していますが、相互運用可能になるように設計された機能ペアではありません。
エラーが発生しやすい塩値とアルゴリズムの選択を手動で管理します。
不適切に使用されている場合(デフォルトのDESアルゴリズムや塩の値が弱いなど)、ブルートフォースの亀裂が生じる傾向があります。
自動更新アルゴリズムのメカニズムはありません。
将来の互換性を保証することはできません。
セキュリティデフォルトのアルゴリズム(bcryptなど)を自動的に選択します。
塩値を自動的に生成します。
アルゴリズムはよくカプセル化されており、開発者は基礎となる実装を気にする必要はありません。
スムージングアルゴリズムは、 password_needs_rehash()を介してアップグレードできます。
安全性は現代の基準でレビューされています。
セキュリティと将来の互換性を向上させるには、 password_verify()でpassword_hash()を常に使用することをお勧めします。
// パスワードを登録または変更するとき
$hash = password_hash('mySecret', PASSWORD_DEFAULT);
// ログイン時に確認します
if (password_verify('mySecret', $hash)) {
// 検証は成功しました
}
古いシステムでcrypt()を使用する場合、ユーザーログインが成功し、データベースの値を更新した後、ハッシュを再生するためにpassword_hash()を使用することをお勧めします。このアプローチは、より安全な暗号化方法に徐々にスムーズに移行できます。
Crypt()はPHPのベテランですが、パスワード処理の分野で、より近代的で安全なpassword_hash()およびpassword_verify()に徐々に置き換えられました。 Crypt()とPassword_verify()を組み合わせて使用しても、予想されるセキュリティ改善はもたらされませんが、非互換性のために検証障害やその他の問題を引き起こす可能性があります。したがって、ベストプラクティスは、PHPが提供するPassword_Series関数を完全に採用してユーザーパスワード *を処理して、システムのセキュリティと保守性を確保することです。
さらなるセキュリティ対策のために、Argon2アルゴリズムを組み合わせて使用できます。