PHPでは、 crypt()関数は一方向暗号化の関数であり、パスワードストレージなどのシナリオによく見られます。現在、 password_hash()などのより近代的な方法を使用することをお勧めしますが、 Crypt()の作業メカニズム、特にその概念を理解することは依然として理にかなっています。この記事では、Crypt()機能における塩の役割、形式、実用的な例を詳細に紹介します。
塩は、暗号化されたときに元のデータを破壊するためにパスワードの前または後に追加された小さな文字列であり、したがってセキュリティが改善されます。簡単に言えば、Saltの機能は、同じパスワードを暗号化後に異なる結果を得ることができるようにすることで、攻撃者がテーブル(レインボーテーブルなど)を調べて元のパスワードを再リリースすることを妨げます。
たとえば、2人のユーザーのパスワードがPassword123の場合、暗号化値は塩なしでまったく同じになります。パスワードが同じであっても、異なる塩が追加されると、暗号化の結果は完全に異なります。
PHPでは、 Crypt()の基本的な構文は次のとおりです。
crypt(string $string, string $salt): string
ここで、 $文字列は暗号化されるプレーンテキストパスワードであり、 $塩は暗号化アルゴリズムのパラメーターです(塩だけでなく、使用されるアルゴリズムも決定します)。
crypt()は複数の暗号化アルゴリズムをサポートし、異なるアルゴリズムに必要な塩形式も異なります。いくつかの一般的なアルゴリズムとその塩形式は次のとおりです。
crypt('mypassword', 'rl');
塩:任意の2文字(合計12ビット)
弱い暗号化、推奨されません
crypt('mypassword', '$1$abc12345$');
塩形式: $ 1 $ + 1-8文字
アルゴリズム:MD5に基づいています
出力長:34文字
crypt('mypassword', '$2y$10$usesomesillystring22$');
塩形式: $ 2Y $ + 2ビットコストパラメーター + 22文字ベース64エンコード塩
コストパラメーター(上記の例の10のように)暗号化強度を制御します
出力長:60文字
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 "エラーパスワード。";
}
?>
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()のメカニズムを理解することは、暗号化の背後にある原則とリスク保護戦略を理解するのに役立ちます。