PHPでパスワード暗号化を扱う場合、 Crypt()およびPassword_Hash()を使用してパスワードのハッシュ値を生成できますが、これら2つの機能には明らかな違いがあります。暗号化機能を選択するとき、アプリケーションのセキュリティを確保するためには、それぞれの原則と利点を理解することが重要です。
Crypt()は、UNIXシステムにまでさかのぼることができる長年の暗号化関数です。提供する塩値とシステムでサポートされているアルゴリズムに応じて、さまざまな暗号化アルゴリズム(DES、MD5、SHA-256、SHA-512など)をサポートします。
$password = 'mySecretPassword';
$salt = '$6$rounds=5000$anexamplesaltstring$'; // 使用 SHA-512
$hash = crypt($password, $salt);
生成された$ハッシュは、提供された塩形式に基づいて暗号化アルゴリズムを選択します。この例では、SHA-512が使用されます。
Password_hash()は、PHP 5.5以降に導入された最新のパスワードハッシュ関数です。デフォルトでBCRyptアルゴリズムを使用し、新しいバージョン(PHP 7.2以降)でArgon2iとArgon2IDもサポートします。パスワードハッシュ用に設計されており、塩の値とコスト要因を自動的に管理し、安全なコーディングの取り組みを大幅に簡素化します。
$password = 'mySecretPassword';
$hash = password_hash($password, PASSWORD_DEFAULT); // デフォルトで使用されます bcrypt
生成された$ハッシュは、開発者による手動設定を必要とせずに、アルゴリズム情報、コスト、塩を含む文字列です。
特性 | crypt() | password_hash() |
---|---|---|
塩の価値管理 | 開発者が手動でセットアップする必要があります | 自動的に生成します |
アルゴリズム | さまざまな、指定する必要があります | デフォルトのbcryptは、 Argon2をサポートしています |
安全 | 実装と構成に依存します | デフォルトでは、ベストプラクティスに従ってください |
使いやすさ | 複雑なエラーが発生しやすい | シンプルで使いやすい |
推奨程度 | 新しいプロジェクトにはお勧めしません | 強くお勧めします |
Password_hash()で使用されるアルゴリズムは、パスワード( BCRYPTやArgon2など)のハッシュ用に設計されており、GPU加速攻撃などの最新のパスワードクラッキングテクノロジーに抵抗できます。
Password_Default定数を使用して、PHPはコードを変更せずにより安全なアルゴリズムに自動的に切り替えることができます。例えば:
$hash = password_hash($password, PASSWORD_DEFAULT);
PHPの更新により、 Password_Defaultは、 BcryptからArgon2IDへの切り替えなど、より強力なアルゴリズムを自動的に採用します。
password_hash()は塩の値とコスト要因を自動的に処理するため、人間のセットアップエラーによって引き起こされるセキュリティの問題を大幅に削減します。
たとえば、ユーザー認証システムを構築している場合、次の形式の登録処理スクリプト:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
// データベースに保存します
$conn = new PDO('mysql:host=localhost;dbname=example', 'user', 'pass');
$stmt = $conn->prepare('INSERT INTO users (username, password) VALUES (?, ?)');
$stmt->execute([$_POST['username'], $hash]);
header('Location: https://m66.net/login-success');
}
この場合、 Password_hash()を使用することは大幅に安全でモダンであり、システムのセキュリティと保守性を長時間維持できます。
Crypt()はまだ使用可能ですが、 Password_hash()は、セキュリティ、使いやすさ、将来の保守性の観点からより適切な選択肢です。特に、ユーザーのパスワードが処理されるシナリオでは、 password_hash()をpassword_verify()で使用して、ユーザー入力を検証し、より安全なPHPアプリケーションを作成する必要があります。