コンテンツ管理システム(CMS)では、ユーザーデータのセキュリティ、特にパスワードのストレージが重要です。 PHPに付属するCrypt()関数は、クラシックで安全なパスワード暗号化方法です。それを合理的に使用すると、システムのセキュリティが大幅に向上する可能性があります。この記事では、パスワードストレージのセキュリティと柔軟性を確保するために、CMSシステムでCrypt()機能を効果的に統合する方法について詳しく説明します。
Crypt()は、PHPに組み込みの暗号化関数であり、さまざまな暗号化アルゴリズム(DES、BlowFish、SHA-256、SHA-512など)に基づいて実装されています。パスワードハッシュストレージに適した「塩値」パラメーターを渡すことにより、不可逆的な暗号化された文字列を生成します。
$hashed_password = crypt($password, $salt);
塩の値は、暗号化のセキュリティを確保し、虹のテーブル攻撃を防ぐための鍵です。
crypt()は、次のように形式のさまざまなアルゴリズムをサポートしています。
DES (推奨されていない、低セキュリティ)
blowfish (識別子$ 2y $ 、最新のパスワードハッシュに推奨)
SHA-256 (識別子$ 5 $ )
SHA-512 (識別子$ 6 $ )
たとえば、blowfishを使用してください。
$salt = '$2y$12$' . substr(bin2hex(random_bytes(16)), 0, 22);
$hash = crypt($password, $salt);
ここでは、 $ 2Y $がアルゴリズムを表し、 12はコストパラメーター(反復数、値が大きく、より安全ですが、時間がかかります)、22文字の塩が続きます。
function createPasswordHash($password) {
// ランダム塩を生成します,使用 Blowfish アルゴリズム
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
// ハッシュを生成します
return crypt($password, $salt);
}
ユーザーが登録すると、プレーンテキストパスワードは上記の機能を介して生成され、データベースに保存されます。
function verifyPassword($password, $hashedPassword) {
// 使用 stored hash 暗号化の塩の比較
return crypt($password, $hashedPassword) === $hashedPassword;
}
ログインするときは、データベースに保存されているハッシュパスワードを取り出し、その塩を使用して入力パスワードをもう一度暗号化し、一致するかどうかを比較して決定します。
パスワードフィールドは、blowfishによって生成されたハッシュに対応するために少なくとも60文字の長さで、文字列タイプであることをお勧めします。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash CHAR(60) NOT NULL,
...
);
塩をカスタマイズしないでください: crypt()で生成された塩形式を使用するか、 password_hash()関数(PHP 5.5+)を使用して操作を簡素化します。
パスワードの更新:古いパスワードに弱いアルゴリズムを使用するユーザーを検討し、ログイン時により強い暗号化されたハッシュを再生します。
パスワード強度:フロントエンドとバックエンドの強制パスワードの複雑さを組み合わせて、パスワードが弱いことを避けます。
プレーンテキストのストレージを避けてください:プレーンテキストパスワードや可逆的な暗号化されたパスワードを保存しないでください。
PHP 5.5から開始すると、 password_hash()およびpassword_verify()は、よりシンプルで安全なパスワード管理インターフェイスを提供し、基礎となるレイヤーもcrypt()に基づいています。最初に新しいプロジェクトを使用することをお勧めします:
$hash = password_hash($password, PASSWORD_BCRYPT);
$isValid = password_verify($password, $hash);
CMSバージョンが古く、 Crypt()を手動で使用する必要がある場合、上記の方法は依然として安全なソリューションです。