現在の位置: ホーム> 最新記事一覧> crypt() + random_bytes()は、より安全な塩値を生成します

crypt() + random_bytes()は、より安全な塩値を生成します

M66 2025-06-02

セキュリティは、PHPでユーザーパスワードを処理する際に、開発者にとって常に最も関係のある問題の1つです。 PHPのPassword_hash()関数は、特定のシナリオでパスワードを保存するための便利で安全な方法を提供していますが、開発者はさらに詳細な制御のためにcrypt()を使用することを選択できます。この記事では、Random_bytes()を組み合わせてパスワードストレージのセキュリティを改善することにより、より安全な塩値を生成する方法を紹介します。

なぜ塩の値がそんなに重要なのですか?

塩は、パスワードの前後に追加され、ハッシュ操作に参加するランダムデータであり、2人のユーザーが同じパスワードを使用しても、最終的に生成するハッシュ値も異なることを保証します。塩の値や固定塩値を使用することで、パスワードがレインボーテーブル攻撃辞書攻撃に対してより脆弱になります。

crypt()を使用する基本的な使用法

crypt()は、パスワードハッシュの関数です。 DESMD5SHA-256SHA-512などの複数のハッシュアルゴリズムをサポートしています。その中で、 SHA-256SHA-512が現在最も推奨されるオプションです。

SHA-512アルゴリズムを使用したCrypt()の例:

 $password = 'examplePassword';
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
$hash = crypt($password, $salt);

$ 6 $は、SHA-512を使用することを意味します。ラウンド= 5000は5000の反復を意味し、次の文字列は塩値です。

ランダム_bytes()を使用して、より安全な塩値を生成します

静的な文字列を使用するのと比較して、 Random_Bytes()は、安全な塩値を構築するのに理想的な、真に暗号化された強力なランダムバイトストリームを生成できます。

ランダム_bytes()crypt()を組み合わせてパスワードを安全にハッシュする方法を示す完全な例を以下に示します。

 function generateSalt($length = 16) {
    // 指定された長さのランダムバイトを生成します,に変換します Base64,もう一度削除すると、影響する可能性があります crypt() の文字
    $rawSalt = base64_encode(random_bytes($length));
    // クリア '+'、'/' そして '=',フィットする crypt() 必要とする
    $cleanSalt = str_replace(['+', '/', '='], '', $rawSalt);
    return substr($cleanSalt, 0, $length);
}

function hashPassword($password) {
    $salt = generateSalt();
    $fullSalt = '$6$rounds=10000$' . $salt . '$';
    return crypt($password, $fullSalt);
}

function verifyPassword($password, $hash) {
    return hash_equals($hash, crypt($password, $hash));
}

使用の例

$userPassword = 'mySecret123';
$hashed = hashPassword($userPassword);

// ストレージ $hashed データベースに移動します

// ログインを確認するとき
$inputPassword = 'mySecret123';
if (verifyPassword($inputPassword, $hashed)) {
    echo 'パスワードを修正します';
} else {
    echo 'エラーパスワード';
}

注意すべきこと

  1. 塩の値の長さの制御crypt()には塩の値の長さの要件があり、通常は16文字に制限され、過剰な部分は切り捨てられます。

  2. 塩値を再利用しないでください:パスワードハッシュが生成されるたびに、新しいランダム塩値を使用する必要があります。

  3. ハッシュ構造を手動で構築しないでください:塩の構造を手動でスプライスすることはできますが( 6ドル$ラウンド= 10000 $塩$など)、潜在的なエラーを回避するために可能な限り公式の方法( Password_hash()など)を使用することをお勧めします。

  4. アップグレードの提案:特定の要件ではない場合は、塩値とアルゴリズムの選択を内部で自動的に処理するPassword_hash()password_verify()を使用することをお勧めします。

まとめ

Random_bytes()crypt()を組み合わせることにより、開発者はパスワード暗号化の各リンクを手動で制御し、パスワードストレージのランダム性と予測不可能性を改善し、より多くの攻撃シナリオに抵抗できます。特に安全性が高いシステムでは、この方法は従来の静的塩値よりも高い保証を提供します。

セキュリティをさらに強化する必要がある場合は、ハッシュ結果を他のユーザー識別子(メールボックス、ユーザー名など)と組み合わせること、またはナトリウムなどのより近代的な暗号化ライブラリを使用することも検討することもできます。ただし、前提は常に次のとおりです。信頼できるランダム塩値を使用することは、パスワードセキュリティの最初のステップです。

実際の展開では、サイト全体でHTTPSが有効になっていることを確認し、データベースのアクセス許可とバックアップポリシーを適切に管理して、平易なテキストパスワードと弱い暗号化方法がシステムセキュリティの弱点になることを回避します。