現在の位置: ホーム> 最新記事一覧> crypt()を使用して、古いシステムのパスワード処理ロジックをリファクタリングします

crypt()を使用して、古いシステムのパスワード処理ロジックをリファクタリングします

M66 2025-05-27

パスワード処理ロジックのセキュリティは、古いシステムを維持およびアップグレードするときに特に重要です。多くの古いシステムで使用されるパスワード暗号化方法は、もはや安全ではなく、簡単に割れます。 PHPは、さまざまな暗号化アルゴリズムを組み合わせて安全なハッシュ値を生成し、パスワード処理ロジックを再構築し、システムセキュリティを改善できるCrypt()関数を提供します。

この記事では、PHPのCrypt()関数の使用方法を紹介し、安全な塩とアルゴリズムを組み合わせ、古いシステムの安全でないパスワード暗号化方法を徐々に置き換えます。

1.なぜcrypt()関数を使用するのですか?

Crypt()は、PHPに組み込みのパスワードハッシュ機能であり、次のようなさまざまな暗号化アルゴリズムをサポートしています。

  • des

  • MD5

  • ブローフィッシュ

  • SHA-256

  • SHA-512

入ってくる塩に基づいて対応するアルゴリズムを自動的に選択して、高強度のパスワードハッシュを生成できます。 MD5やSHA1などの関数を直接使用するのと比較して、 Crypt()はパスワードの暗号化により適しています。

2。古いシステムパスワード処理の問題

多くの古いシステムには、パスワード暗号化が単純で、次の欠陥がある場合があります。

  • 塩のない単一のハッシュ(MD5やSHA1など)を使用すると、虹のテーブル攻撃によって簡単に割れることができます。

  • 塩は固定または単純であり、同じパスワードが同じハッシュを生成するのを防ぐことはできません。

  • プレーンテキストまたは単純な暗号化を直接保存すると、漏れのリスクがあります。

これらはすべて、システムのセキュリティを大幅に削減しました。

3。crypt ()を使用したパスワード暗号化の例

次の例は、crypt()とblowfishアルゴリズムを組み合わせたパスワードのハッシュを生成する方法を示しています。

 <?php
// ユーザーがサビされたPlantextパスワード
$password = 'user_password';

// ランダム塩を生成します,Blowfishアルゴリズムには塩形式が必要です:$2y$ + costパラメーター + 22キャラクターソルト
$cost = 12; // コストを計算します,数が大きいほど安全ですが、リソースが消費されます。
$salt = sprintf('$2y$%02d$%s', $cost, substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22));

// 使用 crypt() パスワードハッシュを生成します
$hash = crypt($password, $salt);

echo "パスワードハッシュAS: " . $hash;
?>

このハッシュ文字列は、データベースに保存できます。パスワードを確認するときは、同じcrypt()関数を使用し、データベースのハッシュを塩パラメーターとして渡して、正しい塩とアルゴリズムを自動的に使用します。

4。パスワード検証の例

パスワードを確認するには、 Crypt()を1回呼び出して結果を比較するだけです。

 <?php
$input_password = 'user_password'; // ユーザー入力
$stored_hash = '$2y$12$wW5O3K7uGp1oKpJ.HUJZEuWQNUkXpzB1I7N1h7qMm6E82JZXNpM4a'; // ハッシュはデータベースに保存されています

if (crypt($input_password, $stored_hash) === $stored_hash) {
    echo "パスワード検証が合格しました";
} else {
    echo "エラーパスワード";
}
?>

これにより、パスワードが同じであっても、異なる塩によって生成されるハッシュが異なるため、セキュリティが改善されます。

5.古いシステムで徐々に交換する方法

  • 既存のパスワードストレージ方法を評価して、明確なテキストがあるか弱い暗号化があるかを確認します。

  • ユーザーがログインしたときにパスワードハッシュ形式の検出などの設計移行戦略、および古い形式が正常に検証された後、 crypt()を使用して新しいハッシュを生成して古いハッシュを上書きします。

  • 新しいユーザーを追加したり、パスワードをリセットするときは、新しい暗号化方法を直接使用します。

  • システムの全体的なセキュリティ構成を強化し、ログインの試行回数を制限し、HTTPSを使用し、データ送信セキュリティを保護します。

6.一般的な誤解を避けてください

  • 塩の生成ロジックを自分で実装しないでください。 random_bytes()などの強力なランダム関数を使用することをお勧めします。

  • 低コストのアルゴリズムを使用しないでください。コストパラメーターを合理的に設定します(Blowfishのコスト> = 12など)。

  • URL送信にパスワードハッシュを直接使用しないようにし、必要に応じて適切にエンコードおよび保護されていることを確認してください。

7。フレームワークとライブラリの組み合わせ

システムがサポートしている場合、PHPのネイティブPassword_hash()password_verify()関数(PHP 5.5+)を組み合わせることができます。基礎となる層は、 Crypt()を使用して、より簡潔で安全なインターフェイスを提供します。

 <?php
$hash = password_hash('user_password', PASSWORD_BCRYPT);
if (password_verify('user_password', $hash)) {
    echo "パスワード検証が成功しました";
}
?>

8。追加のリソース