現在の位置: ホーム> 最新記事一覧> PHPの地下機能を使用して、複数のアルゴリズムの塩テンプレートを動的に生成する方法は?

PHPの地下機能を使用して、複数のアルゴリズムの塩テンプレートを動的に生成する方法は?

M66 2025-06-11

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_hashpassword_verify関数を検討することをお勧めします。

  • 塩の弦の手動でスプライシングパラメーターを避けるようにしてください。ランダム_intなどの信頼できる乱数生成関数を使用することをお勧めします。

  • セキュリティに応じてラウンド(反復数)を定期的に調整し、ブルートフォースの亀裂に抵抗する能力を向上させます。