PHPでは、クリプト関数はパスワードハッシュの古典的な関数です。 DES、MD5、BlowFish、SHA-256、SHA-512など、さまざまな暗号化アルゴリズムをサポートしています。適切な塩を使用すると、パスワードセキュリティが強化されるだけでなく、暗号化アルゴリズムとハッシュの複雑さも制御します。
この記事では、複数のアルゴリズムの塩テンプレートを動的に生成する方法を詳細に説明します。これにより、 Crypt関数を使用するときにアルゴリズムと塩値を柔軟に指定できます。
$password = 'mypassword';
$salt = '$6$rounds=5000$usesomesillystring$'; // SHA-512 塩の例
$hash = crypt($password, $salt);
echo $hash;
上記の例では、 $ 6 $はSHA-512アルゴリズムを使用することを意味し、ラウンド= 5000は暗号化の反復の数を表し、次の文字列は塩値本体です。
アルゴリズム | 塩のプレフィックス | 塩の長さと説明 |
---|---|---|
des | プレフィックスなし | 2文字の塩 |
MD5 | $ 1 $ | 8文字の塩 |
ブローフィッシュ | $ 2A $または$ 2Y $ | 22文字の塩(バージョンとコストパラメーターを含む) |
SHA-256 | $ 5 $ | オプションのパラメーターラウンド、16文字までの塩体 |
SHA-512 | $ 6 $ | オプションのパラメーターラウンド、16文字までの塩体 |
これらを理解した後、異なるアルゴリズムに基づいて適切な塩テンプレートを動的に生成できます。
入力アルゴリズム名に基づいて、対応する形式で塩テンプレートを生成できるPHP関数の例を次に示します。
function generateSalt($algorithm = 'sha512', $rounds = 5000) {
// ランダム塩の体の生成機能,長さは、アルゴリズムの制限に従って調整されます
function randomSalt($length) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./';
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt .= $chars[random_int(0, strlen($chars) - 1)];
}
return $salt;
}
switch (strtolower($algorithm)) {
case 'des':
// DES 塩の前にのみ2キャラクター
return substr(randomSalt(2), 0, 2);
case 'md5':
// MD5 塩形式 $1$salt$
return '$1$' . randomSalt(8) . '$';
case 'blowfish':
// Blowfish 形式 $2y$cost$22charsalt
$cost = 10; // 2数字,それを推奨することをお勧めします04到着31間
$costStr = str_pad($cost, 2, '0', STR_PAD_LEFT);
return '$2y$' . $costStr . '$' . randomSalt(22);
case 'sha256':
// SHA-256 形式 $5$rounds=xxxx$salt$
return '$5$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
case 'sha512':
default:
// SHA-512 形式 $6$rounds=xxxx$salt$
return '$6$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
}
}
$password = 'my_secret_password';
// 選択アルゴリズム
$algorithm = 'blowfish';
// 対応する塩テンプレートを生成します
$salt = generateSalt($algorithm);
// ハッシュを生成します
$hash = crypt($password, $salt);
echo "アルゴリズム: {$algorithm}\n";
echo "塩テンプレート: {$salt}\n";
echo "ハッシュを生成します: {$hash}\n";
このようにして、パスワードを暗号化するときに使用されるアルゴリズムと塩パラメーターを非常に柔軟に制御でき、セキュリティを強化できます。
より安全なパスワードハッシュスキームを使用して、PHPの組み込みのPassword_hashとpassword_verify関数を検討することをお勧めします。
塩の弦の手動でスプライシングパラメーターを避けるようにしてください。ランダム_intなどの信頼できる乱数生成関数を使用することをお勧めします。
セキュリティに応じてラウンド(反復数)を定期的に調整し、ブルートフォースの亀裂に抵抗する能力を向上させます。