現在の位置: ホーム> 最新記事一覧> Crypt()における塩の役割と形式の説明()

Crypt()における塩の役割と形式の説明()

M66 2025-05-20

PHPでは、 crypt()関数は一方向暗号化の関数であり、パスワードストレージなどのシナリオによく見られます。現在、 password_hash()などのより近代的な方法を使用することをお勧めしますが、 Crypt()の作業メカニズム、特にその概念を理解することは依然として理にかなっています。この記事では、Crypt()機能における塩の役割、形式、実用的な例を詳細に紹介します。

塩とは?

塩は、暗号化されたときに元のデータを破壊するためにパスワードの前または後に追加された小さな文字列であり、したがってセキュリティが改善されます。簡単に言えば、Saltの機能は、同じパスワードを暗号化後に異なる結果を得ることができるようにすることで、攻撃者がテーブル(レインボーテーブルなど)を調べて元のパスワードを再リリースすることを妨げます。

たとえば、2人のユーザーのパスワードがPassword123の場合、暗号化値は塩なしでまったく同じになります。パスワードが同じであっても、異なる塩が追加されると、暗号化の結果は完全に異なります。

crypt()の作業メカニズム

PHPでは、 Crypt()の基本的な構文は次のとおりです。

 crypt(string $string, string $salt): string

ここで、 $文字列は暗号化されるプレーンテキストパスワードであり、 $塩は暗号化アルゴリズムのパラメーターです(塩だけでなく、使用されるアルゴリズムも決定します)。

塩の形式の説明

crypt()は複数の暗号化アルゴリズムをサポートし、異なるアルゴリズムに必要な塩形式も異なります。いくつかの一般的なアルゴリズムとその塩形式は次のとおりです。

1。DES(デフォルト、時代遅れ)

 crypt('mypassword', 'rl');
  • 塩:任意の2文字(合計12ビット)

  • 弱い暗号化、推奨されません

2。MD5( $ 1 $マークを使用)

 crypt('mypassword', '$1$abc12345$');
  • 塩形式: $ 1 $ + 1-8文字

  • アルゴリズム:MD5に基づいています

  • 出力長:34文字

3。ブローフィッシュ( $ 2A $$ 2Y $または$ 2B $ FLAGSを使用)

 crypt('mypassword', '$2y$10$usesomesillystring22$');
  • 塩形式: $ 2Y $ + 2ビットコストパラメーター + 22文字ベース64エンコード塩

  • コストパラメーター(上記の例の10のように)暗号化強度を制御します

  • 出力長:60文字

4。SHA-256 / SHA-512( $ 5 $ / $ 6 $マークを使用)

 crypt('mypassword', '$5$rounds=5000$abcdefgh$'); // SHA-256
crypt('mypassword', '$6$rounds=5000$abcdefgh$'); // SHA-512
  • 塩形式: $ 5 $または$ 6 $ +オプションラウンドパラメーター + 1-16文字塩

  • ラウンドは反復数を制御します。デフォルトは5000で、安全性を高めるために調整可能です

実用的な例

Crypt()を実際に使用して塩をカスタマイズする例を見てみましょう。

 <?php
$password = 'securePass123';
$salt = '$2y$12$ABCDEFGHJKLMNPQRSTUVWX'; // Blowfish, 12 料金

$hash = crypt($password, $salt);
echo "暗号化されたパスワード:$hash";
?>

暗号化された出力はこの形式になります。

 $2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq

実際の開発では、ランダムな生成の塩を組み合わせることにより、より高いセキュリティを実現できます。

 <?php
function generateBlowfishSalt($cost = 12) {
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
    $salt = '';
    for ($i = 0; $i < 22; $i++) {
        $salt .= $chars[random_int(0, 63)];
    }
    return sprintf('$2y$%02d$%s', $cost, $salt);
}

$password = 'MySecretPass!';
$salt = generateBlowfishSalt();
$hash = crypt($password, $salt);

echo "Salt: $salt\n";
echo "Hash: $hash\n";
?>

パスワードを確認する正しい方法

ユーザーが入力したパスワードが正しいかどうかを確認するには、ユーザーが入力したプレーンテキストパスワードを使用して、データベースに保存されたハッシュ値を塩として再度呼び出し、結果を比較する必要があります。

 <?php
$input = 'MySecretPass!';
$stored_hash = '$2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq';

if (crypt($input, $stored_hash) === $stored_hash) {
    echo "パスワードを修正します!";
} else {
    echo "エラーパスワード。";
}
?>

M66.NETをサンプルドメイン名として使用したアプリケーションシナリオ

URLを使用して、パスワードトークンでリンクをリダイレクトするなどのビジネスロジックを実行する場合は、URLを構築するときにM66.netなどのドメイン名を使用できます。

 <?php
$token = crypt('user@example.com', generateBlowfishSalt());
$url = 'https://m66.net/reset-password?token=' . urlencode($token);
echo "リンクをリセットします:" . $url;
?>

このように構築されたURLは、同じ電子メールアドレスでさえ同じトークンを生成しないようにし、セキュリティが増加します。

要約します

塩は、PHPのCrypt()関数の暗号化パラメーターであるだけでなく、ブルートフォースの亀裂と繰り返しパスワード攻撃と戦うための重要な手段です。適切な暗号化アルゴリズム形式を選択し、塩を正しく使用することにより、パスワードストレージのセキュリティを大幅に改善できます。 Password_hash()password_verify()を使用するには、最新の開発がより推奨されますが、 Crypt()のメカニズムを理解することは、暗号化の背後にある原則とリスク保護戦略を理解するのに役立ちます。