最新のWebアプリケーション開発では、ユーザーパスワードの安全なストレージが重要です。 PHPは、さまざまなパスワード暗号化方法を提供します。その中には、Crypt()関数は柔軟で強力な暗号化ツールです。この記事では、PHPのCrypt()機能を使用してユーザーパスワードを安全に暗号化および検証する方法を紹介し、一般的なセキュリティトラップを回避する方法を説明します。
crypt()は、複数の暗号化アルゴリズムをサポートするパスワードハッシュ関数です。特定のアルゴリズムは、渡す「塩」に依存します。さまざまなアルゴリズムには、 SHA-256 、 SHA-512などの塩形式が異なります。Crypt ()の合理的な使用は、強力なパスワードハッシュを生成し、亀裂の難易度を高めることができます。
string crypt(string $password, string $salt);
$パスワードは、ユーザーが入力したPlantextパスワードです。
$塩は、暗号化アルゴリズムとランダム塩値を指定するために使用され、各暗号化の結果が異なることを確認します。
塩の機能は、虹のテーブル攻撃を防ぐことであり、各パスワードには一意の塩値が必要です。最新のアルゴリズムの場合、塩にはアルゴリズムの識別、反復数、ランダム文字が含まれている必要があります。
次の例では、SHA-512アルゴリズムに基づいて塩を生成します。
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
$ 6 $は、 SHA-512を使用することを意味します。
ラウンド= 5000はハッシュ反復の数を制御します。
ランダムな文字列は、塩の独自性を確保します。
上記の塩を組み合わせると、次のようなパスワードを暗号化できます。
$password = 'user_password_here';
$salt = generateSalt();
$hash = crypt($password, $salt);
$ hashは、データベースに保存されているパスワードハッシュ文字列です。
検証中、パスワードとハッシュを直接比較することはできませんが、 Crypt()をユーザー入力パスワードと呼び出し、保存されたハッシュを塩として渡します。関数は塩を自動的に抽出し、パスワードを暗号化します。
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
Hash_equals()を使用して、タイミング攻撃を防ぎ、比較的安全にします。
<?php
// 塩機能を生成します
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
// 登録時にパスワードを暗号化します
function encryptPassword($password) {
$salt = generateSalt();
return crypt($password, $salt);
}
// ログインするときにパスワードを確認します
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
// 例
$userPassword = 'MySecurePass123';
$storedHash = encryptPassword($userPassword);
echo "暗号化されたハッシュ: " . $storedHash . "\n";
$inputPassword = 'MySecurePass123';
if (verifyPassword($inputPassword, $storedHash)) {
echo "パスワード検証が成功しました!";
} else {
echo "エラーパスワード!";
}
?>
PHP 7.2+のpassword_hash()とpassword_verify()を使用してみてください。これは、より近代的で安全なアルゴリズムをカプセル化しますが、特別な理由でcrypt()を使用する必要がある場合は、上記の方法を参照してください。
パスワードハッシュ戦略を定期的に更新して、反復回数を増やします。
データベースに保存されているハッシュ文字列には、塩とアルゴリズムの情報が含まれており、塩を個別に保管する必要はありません。