データベースからソルトされたパスワードを使用してユーザーを認証する方法
データベース駆動の Web アプリケーションでは、ユーザーのパスワードを不正アクセスから保護することが不可欠です。パスワードのソルティングは、ユーザー資格情報の保護を強化する重要なセキュリティ対策です。この Q&A では、安全なユーザー認証のためにデータベースからソルト付きパスワードを取得して認証する方法について説明します。
問題:
開発者がメンバーを実装しました。ソルト付きパスワードが MySQL データベースに保存されているサイト。ただし、メンバーの存在確認に問題があるため、ログイン ページではメンバーシップ サイトへのあらゆるアクセスが許可されています。
メンバーの存在を確認するコード:
$servername = 'localhost'; $username = 'root'; $pwd = ''; $dbname = 'lp001'; $connect = new mysqli($servername, $username, $pwd, $dbname); if ($connect->connect_error) { die('connection failed, reason: ' . $connect->connect_error); } $name = mysqli_real_escape_string($connect, $_POST['name']); $password = mysqli_real_escape_string($connect, $_POST['password']); $saltQuery = "SELECT salt FROM users WHERE name = '$name';"; $result = mysqli_query($connect, $saltQuery); if ($result === false) { die(mysqli_error()); } $row = mysqli_fetch_assoc($result); $salt = $row['salt']; $saltedPW = $password . $salt; $hashedPW = hash('sha256', $saltedPW); $sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'"; if (mysqli_query($connect, $sqlQuery)) { echo '<h1>Welcome to the member site ' . $name . '</h1>'; } else { echo 'error adding the query: ' . $sql_q . '<br> Reason: ' . mysqli_error($connect); }
解決策:
コードのエラーはメンバーの存在チェックにあります。保存されているソルト付きパスワード ハッシュに対してユーザーのパスワードを正しく検証するには、次の手順が必要です:
データベースからソルト付きパスワード ハッシュを取得します:
SQL クエリを使用して、指定されたユーザー名のソルト付きパスワード ハッシュをデータベースから取得します。
ハッシュされたパスワードを計算します:
連結ユーザーが入力したパスワードと取得したソルトを使用して、データベースにパスワードを保存するために使用したのと同じハッシュ関数を使用してハッシュ化します。
ハッシュ化されたパスワードと保存されたハッシュを比較します:
計算されたハッシュ化されたパスワードと、保存されているソルト化されたパスワードのハッシュを比較します。一致する場合、ユーザーのパスワードは正しいです。
以下は、次の手順を組み込んだメンバー存在チェック コードの更新バージョンです。
$verifyQuery = "SELECT id, password FROM users WHERE name = '$name';"; $verifyResult = mysqli_query($connect, $verifyQuery); if ($verifyResult === false) { die(mysqli_error()); } $verifyRow = mysqli_fetch_assoc($verifyResult); if ($verifyRow) { $storedHash = $verifyRow['password']; $saltedPW = $password . $verifyRow['salt']; $hashedPW = hash('sha256', $saltedPW); if ($hashedPW === $storedHash) { // User authenticated successfully } else { // Incorrect password } } else { // User not found }
結論:
これらの手順に従うことで、開発者はデータベースに保存されているソルト付きパスワード ハッシュに対してユーザー パスワードを安全に検証できます。これにより、ユーザー認証情報の整合性と保護が保証され、不正アクセスから保護されます。
以上がMySQL データベースでソルト付きパスワード認証が機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。