パスワードハッシュにPHPのcrypt()関数を使用する場合、塩のセキュリティはパスワードストレージのセキュリティに直接影響します。塩値の機能は、同じパスワードが同じハッシュ値を生成するのを防ぐことであり、それにより虹のテーブル攻撃に効果的に抵抗することです。したがって、安全で信頼性の高い塩値を生成することが非常に重要です。
塩値は、パスワードに追加されてからハッシュされるランダムな文字列です。良好な塩値には、次の特性が必要です。
ユニークでランダム:各パスワードは、一意の塩値に対応しています。
十分に長い:塩の値が簡単に推測されないようにしてください。
ハッシュするアルゴリズムに適しています:異なるアルゴリズムには、塩値の長さと形式の要件があります。
crypt()は複数の暗号化アルゴリズムをサポートしており、異なるアルゴリズムには塩値形式の要件が異なります。一般的なアルゴリズムと塩の値形式は次のとおりです。
DES :塩値の長さは2文字です。
MD5 : $ 1 $ $ 1 $の$ 1から始めて、 $ 1 $ ABCDEFGH $など。
Blowfish : $ 2a $または$ 2Y $で開始し、2桁のコスト要因と22文字の塩の値$ 10 $ $ 10 $ abcdefghijklmnopqrstuvなどの塩値が続きます。
SHA-256 : $ 5 $から始め、その後、塩の値、最大16文字の長さ。
SHA-512 : $ 6 $から始めて、最大16文字の塩値が続きます。
ブローフィッシュ( $ 2Y $ )またはSHA-512( $ 6 $ )アルゴリズムは、より安全で、より長い塩値をサポートするため、推奨されます。
塩値を生成するための鍵は、安全な乱数生成関数を使用し、対応するアルゴリズムの塩値形式の要件に準拠することです。
サンプルコード:
<?php
function generateSalt($algo = 'bcrypt') {
switch ($algo) {
case 'bcrypt':
// Blowfish 必要 22 個々 Base64 キャラクター,コストはです 10
$cost = 10;
// ランダムバイトを使用します,转换成可用的キャラクター集
$randomBytes = random_bytes(16);
$base64String = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64String);
case 'sha512':
// SHA-512 最大許容16キャラクター盐
$randomBytes = random_bytes(12);
return '$6$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16);
default:
throw new Exception("Unsupported algorithm");
}
}
// 使用の例
$password = 'user_password';
$salt = generateSalt('bcrypt');
$hash = crypt($password, $salt);
echo "塩値:$salt\n";
echo "ハッシュ値:$hash\n";
?>
上記のコードで:
ランダム_bytes()は、安全なランダムバイトを生成するために使用されます。
base64_encode()はエンコードされ、 +に置き換えられて、塩値形式の要件を満たします。
Blowfishはコストファクター10を使用します。これは、パフォーマンスが安全で合理的なものです。
生成された塩値は、 Crypt()が必要とする形式の形式です。
PHP 7.2以上は、塩の値の生成とアルゴリズムの選択を自動的に処理するビルトインPassword_hash()関数を使用することを強くお勧めします。
<?php
$password = 'user_password';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;
?>
Crypt()を手動で使用する必要がある場合は、塩の値が安全でランダムであり、形式が正しいことを確認してください。そうしないと、ハッシュの弱体化に簡単につながります。