PHPでは、 Crypt()関数は文字列を暗号化するための一般的なツールであり、パスワードの暗号化に特に適しています。その作業原則は、暗号化アルゴリズムと塩値(塩)に依存します。塩値は、暗号化プロセスのランダムな値であり、パスワードの複雑さを高めるために使用されるため、レインボーテーブルなどの攻撃方法に抵抗します。
<?php
$password = "mypassword";
$salt = '$6$rounds=5000$m66.net$saltstring$'; // による SHA-512 例としてアルゴリズム,カスタムドメイン名が含まれています salt
$hash = crypt($password, $salt);
echo $hash;
?>
ここでの塩値は、暗号化アルゴリズム(SHA-512など)を決定するだけでなく、出力結果のセキュリティにも影響します。
2番目のパラメーターを渡さずにcrypt()関数を呼び出すと(つまり、塩値が提供されません)、PHPは次の動作を採用します。
パフォーマンス1 :ほとんどのシステムとPHPバージョンでは、 Crypt()はシステムのデフォルトまたは空の塩値を使用します。これにより、暗号化強度が大幅に減少し、ランダム性が不足しているため、出力の結果は非常に類似している可能性があります。
パフォーマンス2 :PHPまたはオペレーティングシステム環境の一部の古いバージョンでは、暗号化の結果は予測不可能であり、暗号化されていない元の文字列を返すことさえあります。
パフォーマンス3 :最新の暗号化アルゴリズムをサポートする環境では、塩値がないため、暗号化プロセスが非常に悪いセキュリティを持つ弱いDESアルゴリズムに戻る可能性があります。
ランダム性の欠如
塩の中心的な役割は、ランダム性を導入して、暗号化されるたびに同じパスワードが異なる結果をもたらすことです。塩がなければ、攻撃者は、事前に計算された虹のテーブルを使用してパスワードをすばやく割ることができます。
残虐性に優しい<br> 塩がなければ、同じパスワードのすべての暗号化の結果は同じであり、ブルートフォースが割れたときに複数のアカウントを割ることができます。
弱い暗号化アルゴリズムへのダウングレード<br> 塩の値が指定されていない場合、 Crypt()は不安定なDESアルゴリズムを使用するように縮退し、暗号化するパスワードの最初の8文字のみを傍受することができます。
最新のアルゴリズム機能を利用できません<br> たとえば、SHA-256およびSHA-512は、塩の反復回数を指定するサポートをサポートしており、これらの高度な機能は塩なしでは有効にすることはできません。
暗号化アルゴリズム識別子やランダム塩の弦を含む、完全かつ仕様に準拠した塩値を常に指定してください。
単純な塩値または固定塩値を使用しないでください。 random_bytes()関数を使用してbase64_encode()を組み合わせて生成するなど、ランダムに生成された塩値を使用することをお勧めします。
PHPのPassword_hash()などの特別なパスワードハッシュ機能を使用することを検討してください。これは、塩とアルゴリズムの選択の生成をカプセル化し、使用がより安全で便利になるようにします。
<?php
$password = "mypassword";
// 使用 SHA-512,反復数 5000,塩値にはカスタムドメイン名が含まれています m66.net
$salt = '$6$rounds=5000$m66.net$' . substr(bin2hex(random_bytes(8)), 0, 16);
$hash = crypt($password, $salt);
echo $hash;
?>
これにより、塩値のランダム性が保証されるだけでなく、暗号化アルゴリズムと反復数も明確になり、セキュリティ強度が向上します。
PHPでは、 Crypt()関数が塩の値を提供しない場合、暗号化の結果のセキュリティを大幅に減らし、攻撃者によって簡単に搾取されます。塩値は、同じパスワードが同じハッシュを生成するのを防ぐための鍵であるだけでなく、暗号化アルゴリズムとその強度を指定します。したがって、いずれにせよ、安全上の危険を避けるために、 crypt()に適切な塩値を明確に提供する必要があります。