現在の位置: ホーム> 最新記事一覧> crypt()パスワードを生成するときの最適なセキュリティ構成

crypt()パスワードを生成するときの最適なセキュリティ構成

M66 2025-06-05

PHPでは、 Crypt()関数は従来のパスワード暗号化ツールです。さまざまな暗号化アルゴリズム(DES、MD5、BlowFish、SHA-256、SHA-512など)に基づいてパスワードの一方向ハッシュを実装します。これは、ユーザーパスワードの保存と検証に適しています。この記事では、crypt()関数を使用してより安全なパスワードを生成し、パスワードの強度を高めるのに役立つ最適なセキュリティ構成を共有する詳細な方法を紹介します。

1。crypt ()関数の基本

Crypt()関数の基本的な使用法は次のとおりです。

 $hashed_password = crypt($password, $salt);
  • $パスワードは、ユーザーが入力した元のパスワードです。

  • $塩は、暗号化方法と結果を制御するために使用される塩値であり、ハッシュアルゴリズムと結果形式を決定します。

塩値形式は、パスワードのセキュリティに直接影響します。 crypt()がサポートする塩値形式は次のとおりです。

  • DES (デフォルト、塩の長さは2文字、セキュリティが弱い)

  • MD5 (塩形式: $ 1 $ + 8文字塩)

  • blowfish (塩形式: $ 2a $または$ 2y $ + 2桁のコスト + 22文字の塩)

  • SHA-256 (塩形式: $ 5 $ +塩)

  • SHA-512 (塩形式: $ 6 $ +塩)

2.強い塩と適切なアルゴリズムを使用することが重要なのはなぜですか?

パスワードストレージのセキュリティは、アルゴリズム自体だけでなく、塩の強度とアルゴリズムの複雑さにも依存します。

  • 塩の機能:レインボーテーブルの攻撃を防ぎ、毎回同じパスワードが異なって暗号化されることを保証します。

  • アルゴリズム強度:より複雑なアルゴリズムとより高いコンピューティングコスト(ワークファクター)は、ブルートフォースの亀裂に抵抗する可能性があります。

3。crypt ()を使用して、より安全なパスワードを生成する例

次の例は、BlowFishアルゴリズム( $ 2Y $ )と組み合わせてCrypt()を使用する方法を示して、より安全なパスワードを生成します。

 <?php
function generateSecureHash($password) {
    // 生成する22少し安全なランダム塩
    $salt = substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
    // Blowfishアルゴリズムのコストパラメーター,スコープは一般的にです04~31,デフォルト12より安全
    $cost = '12';

    // 塩の糸を構築します,フォーマットはです $2y$料金$塩
    $blowfish_salt = sprintf('$2y$%02d$%s', $cost, $salt);

    // 生成する暗号化されたパスワードハッシュ
    return crypt($password, $blowfish_salt);
}

// テスト
$password = "MyS3cureP@ss!";
$hash = generateSecureHash($password);
echo "暗号化されたパスワードハッシュ: " . $hash;
?>

説明:

  • random_bytes()を使用して、高強度のランダム塩を生成します。

  • $ 2Y $は、安全なパスワードストレージに適したブローフィッシュアルゴリズムを表すために使用されます。

  • コストパラメーター$ costは、アルゴリズムの複雑さを決定します。コストが高いほど安全ですが、計算時間は長くなります。 12は、パフォーマンスと安全性のバランスをとるための推奨価値です。

4。パスワード検証の例

パスワードを検証するときは、 crypt()関数を使用してデータベースに保存されたハッシュを使用してユーザーが入力したパスワードを再暗号化して、結果が同じかどうかを比較します。

 <?php
function verifyPassword($password, $stored_hash) {
    // 使用存储的哈希中的塩重新加密密码
    $hash = crypt($password, $stored_hash);

    // 使用hash_equalsタイム攻撃のセキュリティ比較を防ぎます
    return hash_equals($hash, $stored_hash);
}

// テスト验证
$input_password = "MyS3cureP@ss!";
if (verifyPassword($input_password, $hash)) {
    echo "パスワード検証が成功しました!";
} else {
    echo "エラーパスワード!";
}
?>

5。パスワード強度を改善するためのベストプラクティス

  • 強力なランダム塩を使用:固定または予測可能な塩を使用しないでください。

  • 適切なアルゴリズムを選択します:ブローフィッシュ( $ 2Y $ )、SHA-256( $ 5 $ )、またはSHA-512( $ 6 $ )を優先します。

  • コストパラメーターを調整します:コストが高いほど、計算の時間がかかりますが、セキュリティは強くなります。合理的なバランス。

  • パスワードを制限する試み:ブルートフォースの亀裂を防ぎます。

  • パスワードの複雑な戦略と組み合わせて:強制パスワードの長さと文字の多様性。

  • 定期的にアルゴリズムとコストパラメーターを更新します:コンピューティングパワーが増加するにつれて、安全基準はタイムリーにアップグレードされます。


6。追加のリソース