現在の位置: ホーム> 最新記事一覧> Crypt()を使用して安全なユーザー認証プロセスを実装する方法

Crypt()を使用して安全なユーザー認証プロセスを実装する方法

M66 2025-05-22

最新のWeb開発では、ユーザー認証のセキュリティが重要です。パスワード保護が整っていない場合、ユーザー情報の漏れにつながり、計り知れない損失をもたらす可能性が非常に高くなります。 PHPの組み込みCrypt()関数は、パスワード暗号化を強力にサポートします。合理的なプロセス設計と組み合わせることで、認証セキュリティを大幅に改善できます。この記事では、Crypt()を使用して安全で信頼できるユーザー認証プロセスを実装する方法を詳細に紹介します。

1。crypt()関数を理解します

Crypt()関数はUnixの暗号化アルゴリズムに基づいており、文字列(通常はパスワード)を暗号化するために使用されます。その中心的な利点は、ブローフィッシュ、SHA-256、SHA-512などを含むさまざまな暗号化アルゴリズムをサポートし、パスワードのセキュリティを大幅に強化する塩値(塩)メカニズムを備えていることです。

関数プロトタイプは次のとおりです。

 string crypt(string $password, string $salt);
  • $パスワードは、暗号化されるパスワードの明確なテキストです。

  • $塩は暗号化に使用される塩であり、暗号化アルゴリズムと複雑さを決定できます。

2。安全なユーザー登録プロセスを設計します

ユーザーを登録するときは、プレーンテキストパスワードを暗号化してデータベースに保存する必要があります。例は次のとおりです。

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

// 安全な塩を生成します(による Blowfish 例として)
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);

// 使用 crypt() 暗号化パスワード
$hashedPassword = crypt($password, $salt);

// 意思 $hashedPassword データベースに保存します
// 例:mysqli または PDO コードが簡素化されました

echo "暗号化されたパスワード:$hashedPassword";
?>
  • ブローフィッシュアルゴリズムはここで使用されています。 $ 2Y $はブローフィッシュを表し、 12は計算コストです。数が大きいほど安全ですが、計算は遅くなります。

  • random_bytes(16)は、塩のランダム性を確保するために強い乱数を生成します。

3.安全なログイン検証プロセスを実装します

ユーザーがログインすると、入力されたパスワードがデータベースに保存されたパスワードと一致することを確認する必要があります。 Crypt()の塩は暗号化の結果に含まれているため、再利用できることに注意してください。

 <?php
// ユーザーが入力したパスワード
$password = $_POST['password'];

// データベースからのハッシュパスワードクエリ
$storedHash = /* クエリステートメントで取得したパスワードハッシュ */;

// 同じ塩値でパスワードを再クリップします
$checkHash = crypt($password, $storedHash);

if (hash_equals($storedHash, $checkHash)) {
    // 検証が合格しました
    echo "正常にログインします";
} else {
    // 検証に失敗しました
    echo "用户名または密码错误";
}
?>
  • Hash_equals()を使用して、時間安全な比較を実行して、時間攻撃を避けます。

  • 入力パスワードがデータベース内のパスワードハッシュに対応する塩と同じである限り、 crypt()再暗号化の結果が正確に一致するはずです。

4。包括的な例 - ユーザー登録とログインプロセス

<?php
// 连接数据库例(使用 mysqli)
$mysqli = new mysqli("m66.net", "user", "password", "database");

// ユーザー登録
function registerUser($username, $password) {
    global $mysqli;

    $salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
    $hashedPassword = crypt($password, $salt);

    $stmt = $mysqli->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
    $stmt->bind_param("ss", $username, $hashedPassword);
    return $stmt->execute();
}

// ユーザーログイン検証
function loginUser($username, $password) {
    global $mysqli;

    $stmt = $mysqli->prepare("SELECT password FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $stmt->bind_result($storedHash);
    if (!$stmt->fetch()) {
        return false; // ユーザーは存在しません
    }
    $stmt->close();

    $checkHash = crypt($password, $storedHash);
    return hash_equals($storedHash, $checkHash);
}

// 例调用
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';

    if (isset($_POST['register'])) {
        if (registerUser($username, $password)) {
            echo "正常に登録されています";
        } else {
            echo "登録に失敗しました";
        }
    } elseif (isset($_POST['login'])) {
        if (loginUser($username, $password)) {
            echo "正常にログインします";
        } else {
            echo "用户名または密码错误";
        }
    }
}
?>

5。追加の安全アドバイス

  • HTTPSを使用:データ送信プロセスが暗号化されていることを確認し、中間の攻撃を防ぎます。

  • ログインの試行回数を制限する:ブルートフォースの亀裂を防ぎます。

  • 暗号化コストを定期的に更新します:ハードウェアのパフォーマンスが向上するにつれて、ブローフィッシュのコストパラメーターはタイムリーに増加します。

  • パスワード強度の検出:ユーザーは、登録時に強力なパスワードを設定するように求められます。

  • 機密情報の保存はプレーンテキストに避けてください