本記事は元々2022-07-06に公開され、旧ブログからここに移行されました。 編集:Hermes
PHP登録時のパスワード暗号化処理(ソルト暗号化)
ユーザー登録やログイン時に、パスワードの安全な保存は非常に重要です。本記事では、パスワードソルト(salt)を使用してパスワードを暗号化する方法を紹介します。
🔐 パスワードソルトとは?
パスワードソルト(Salt)は、パスワードとともにハッシュ演算を行うランダムな文字列です。これにより、レインボーテーブル攻撃や、同じパスワードでも異なるハッシュ値が生成される問題を防ぎます。
📝 登録時のパスワード暗号化
<?php
// ユーザー名とパスワードを取得
$username = 'admin';
$password = "123456";
// パスワードソルト生成範囲
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$length = strlen($str); // ソルトの長さ
$len = 5; // ソルトの長さを設定
// ソルトを初期化
$salt = substr(str_shuffle(str_repeat($str, ceil($len / strlen($str)))), 0, $len);
// パスワードを暗号化:md5(md5(パスワード) . ソルト)
$password = md5(md5($password) . $salt);
// 最後に「ユーザー名」「暗号化されたパスワード」「ソルト」をユーザーテーブルに保存
// INSERT INTO users (username, password, salt) VALUES ('$username', '$password', '$salt');
?>🔑 ログイン時のパスワード検証
<?php
// まずユーザー名でデータベースから暗号化されたパスワードとソルトを取得
$username = 'admin'; // フロントエンドから送信されたデータ
$pwd = "123456"; // フロントエンドから送信されたデータ
// データベースから取得したデータ
$password = "8e934fc2152ddaa490159e39b7c7d7e6"; // 暗号化されたパスワード
$salt = "NJnnz"; // ソルト
// パスワードを検証
if (md5(md5($pwd) . $salt) == $password) {
echo "ログイン成功";
} else {
echo "パスワードエラー";
}
?>📊 暗号化フロー図
登録:
ユーザーパスワード → md5() → ソルト追加 → md5() → データベースに保存
ログイン:
ユーザー入力パスワード → md5() → ソルト追加(データベースから取得) → md5() → データベースのパスワードと比較⚠️ セキュリティアドバイス
- より強力なハッシュアルゴリズムを使用する:
password_hash()とpassword_verify()の使用を推奨します - ソルトの長さを増やす:少なくとも16文字のランダム文字列を推奨します
- bcryptを使用する:PHP組み込みの
password_hash()はbcryptを使用しており、より安全です
💡 現代のPHP推奨做法
<?php
// 登録時
$password = password_hash($plainPassword, PASSWORD_BCRYPT);
// ログイン時
if (password_verify($inputPassword, $storedHash)) {
// ログイン成功
}
?>編集:Hermes