Web開発では、ユーザーパスワードの安全なストレージが重要です。 PHPにはパスワード保護に使用できる複数の暗号化方法がありますが、 Crypt()関数は依然として古典的で効果的なツールです。これにより、開発者はBlowfishなどのさまざまなハッシュアルゴリズムを使用して、不可逆的な暗号化された文字列を生成できます。この記事では、Crypt()機能をデータベースと結合して、安全なユーザーパスワードストレージを実現する方法について説明します。
PHPのCrypt()関数は、2つのパラメーターを受け入れる一方向暗号に使用されます。
string crypt ( string $string , string $salt )
$文字列は、暗号化される元の文字列です(通常はパスワード)
$塩は、暗号化の結果に影響する文字列です。異なる塩は異なる暗号化の結果を生成します。
BlowFishアルゴリズムを使用して暗号化するには、塩をフォーマットする必要があります。
$salt = '$2y$10$' . bin2hex(random_bytes(11));
$hashed_password = crypt('user_password', $salt);
$ 2Y $ 10 $は、ブローフィッシュアルゴリズムと10ラウンドの暗号化を使用することを意味します。
暗号化されたパスワードをデータベースに保存するには、ユーザーテーブルが必要です。これがシンプルなユーザーテーブル構造です:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
次に、PHPを使用してデータベースに接続し、ユーザーデータを挿入します。
<?php
$pdo = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "dbuser", "dbpass");
$username = 'testuser';
$password = 'mypassword';
// 生成するsaltパスワードを暗号化します
$salt = '$2y$10$' . bin2hex(random_bytes(11));
$hashed_password = crypt($password, $salt);
// データベースに挿入します
$stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
$stmt->execute([
':username' => $username,
':password' => $hashed_password
]);
?>
ログインするときは、単純なテキストパスワードを単純に比較することはできません。ユーザーテーブルに保存された暗号化されたパスワードを塩として、 Crypt()機能を再度使用する必要があります。
<?php
$input_password = 'mypassword';
$username = 'testuser';
$stmt = $pdo->prepare("SELECT password FROM users WHERE username = :username");
$stmt->execute([':username' => $username]);
$stored_hash = $stmt->fetchColumn();
if (crypt($input_password, $stored_hash) === $stored_hash) {
echo "パスワード検証が成功しました。";
} else {
echo "エラーパスワード。";
}
?>
crypt()関数は安全ですが、 password_hash()とpassword_verify()に徐々に置き換えられました。 crypt()は、古いシステムとの逆方向の互換性が必要なシナリオにより適しています。
ただし、 Crypt()を使用する場合は必ず注意を払ってください。
常に強力なランダム塩を使用し、固定値の使用を避けてください。
暗号化ラウンドの数($ 2Y $ 10 $ 10 $ 10 $ 10など)を制御して、ブルートフォースの亀裂コストを増加させます。
HTTPSを使用してフロントエンドとバックエンドを接続して、送信中のパスワードが傍受されないようにします。
URLに機密データを渡すことは避けてください。