PHPでは、 Crypt()関数がパスワードを暗号化するためによく使用されます。標準DES、MD5、SHA-256、SHA-512などのさまざまなハッシュアルゴリズムをサポートでき、その動作は着信の「塩値」に依存します。塩値は、パスワードの複雑さを増加させるだけでなく、ハッシュの方法と結果を決定します。塩値が正しくないと、ユーザーが正しい元のパスワードを入力したとしても、確認に合格することはできません。
Crypt()の基本的な構文は次のとおりです。
$hashed_password = crypt('元のパスワード', '塩値');
検証中、ユーザーが入力したパスワードは通常、以前に保存されたハッシュを塩値として使用して再暗号化されます。
if (crypt($input_password, $stored_hash) === $stored_hash) {
// パスワードを修正します
}
ここでの重要なポイントは次のとおりです。ハッシュ自体は、塩値の一部として渡され、完全に一貫したアルゴリズムと塩値の使用を確保することです。
塩値には2つの主要な機能があります。
レインボーテーブル攻撃を防ぐ:2人のユーザーが同じパスワードを使用していても、異なる塩値を追加するとハッシュの結果が異なります。
暗号化アルゴリズムと使用するパラメーターをcrypt()に伝えます。
たとえば、次の塩値はSHA-512アルゴリズムの使用を指定し、5000回反復します。
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
異なる塩値で同じパスワードを再構築しようとすると(1つだけが異なる場合でも)、結果は完全に異なります。これはまさにハッシュ関数の特性です。わずかな変化は、出力の結果に大きな違いにつながります。
シナリオを想像してみてください:
$original_hash = crypt('mySecretPassword', '$6$rounds=5000$m66.net$');
ユーザーが再度ログインすると、プログラムは次のように検証されます。
if (crypt('mySecretPassword', '$6$rounds=5000$wrongdomain.com$') === $original_hash) {
echo 'パスワードを修正します';
} else {
echo 'エラーパスワード';
}
ユーザーは正しいパスワードを入力しましたが、 Crypt()は異なる塩値のために完全に異なるハッシュを生成し、検証が失敗します。
同じレシピ(パスワード)を使用するようなものですが、異なる材料(塩)を使用して、最終的に作る皿(ハッシュ)は自然に異なります。
間違った練習:
確認するたびに新しいランダム塩値を生成します。
元のハッシュ値は、検証中に塩値として使用されません。
保存されたハッシュ値を手動で切り捨てるか変更します。
それを行うための正しい方法:
password_hash()やpassword_verify()などの高レベルのAPIを使用して、塩値とアルゴリズムを自動的に管理します。
Crypt()を使用する場合、元のハッシュは常に検証時に塩値として使用されます。
$stored_hash = crypt('userPassword', '$6$rounds=5000$m66.net$'); // 登録時に生成して保存します
// ログイン時に確認します
if (crypt('userPassword', $stored_hash) === $stored_hash) {
echo '検証が合格しました';
} else {
echo '検証に失敗しました';
}
パスワードセキュリティ処理では、塩値は単なる文字列のように見えますが、実際にはハッシュアルゴリズムの動作の決定的なパラメーターです。間違った塩値を使用することは、 Crypt()にパスワードをまったく異なる方法で処理するように指示することと同等であり、最終的には同じハッシュ結果を取得しないようにしています。したがって、 crypt()関数を使用してパスワードを検証する場合、塩値の一貫性を確保することが最も基本的な前提条件です。条件が許可されている場合は、PHPのpassword_hash()およびpassword_verify()インターフェイスを使用して、塩の価値処理エラーによって引き起こされるセキュリティ問題を回避することをお勧めします。