PHPでは、 Crypt()関数は、パスワードを暗号化するための従来の方法です。複数の暗号化アルゴリズムをサポートし、異なる形式で塩値を渡すことにより、特定の暗号化メカニズムを有効にします。近年、より最新のパスワードハッシュAPI( Password_hash()など)が推奨されていますが、 Crypt()は一部の古いシステムで依然として広く使用されています。したがって、 Crypt()関数の適切なアルゴリズムと塩の値形式を選択する方法を理解することは、セキュリティとシステムの互換性を確保するための鍵です。
Crypt()関数は、塩値のプレフィックスを識別するために使用されるアルゴリズムを使用します。以下は、主流のアルゴリズムと対応する塩値形式です。
DES(従来のアルゴリズム)
塩値形式: 2文字(たとえば、 "xy")
安全性:非常に低く、もうお勧めしません。
MD5
塩の値形式: $ 1 $ +最大8文字(たとえば: $ 1 $ ABC12345 )
セキュリティ:弱く、簡単にブルートします。
ブローフィッシュ
塩値形式: $ 2Y $ + 2ビットコストファクター + 22ビットベース64エンコーディング(たとえば: $ 2Y $ 10 $ ABCDEFGHIJKLMNOPQRSTUU )
安全性:高く、広く使用されています。
互換性: $ 2Y $が歴史的なセキュリティの問題を修正するため、 $ 2A $ではなく$ 2Y $を使用することをお勧めします。
SHA-256およびSHA-512(glibc)
塩値形式:
SHA-256: $ 5 $ +オプションラウンドパラメーター +ソルト(たとえば: $ 5 $ラウンド= 5000 $ mysaltvalue )
SHA-512: $ 6 $ +オプションラウンドパラメーター +ソルト(たとえば: $ 6 $ mysaltvalue )
安全性:高
互換性:GLIBC(ほとんどのLinuxシステムなど)でサポートされているプラットフォームで利用できますが、Windowsではありません。
暗号化アルゴリズムを選択するときは、次のポイントを考慮する必要があります。
セキュリティ要件:システムが最新のハードウェアからのブルートフォースの亀裂に抵抗する必要がある場合は、BlowFish( $ 2Y $ )またはSHA-512( $ 6 $ )を使用することをお勧めします。
クロスプラットフォームの互換性:LinuxとWindows間でシステムを移行する必要がある場合、SHAバリアントがWindowsで互換性がないため、最初にBlowFishアルゴリズムを使用する必要があります。
計算コスト制御:ブローフィッシュはコストパラメーター(2–31)をサポートし、サーバーのパフォーマンスに従って調整できます。たとえば、 $ 2Y $ 12 $は2^12の反復を意味します。
塩値は、同じパスワードが同じハッシュを生成するのを防ぐために使用されるため、次の特性は次のとおりです。
一意性:各ユーザーのパスワードでは、別の塩を使用する必要があります。
予測不可能性:安全な擬似ランダム源を使用して塩を生成する必要があります。
塩でハッシュを生成するためにブローフィッシュを使用してコードをサンプリングします。
function generateSalt($cost = 10) {
$salt = substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s$', $cost, $salt);
}
$password = 'MySecurePassword123';
$salt = generateSalt(12);
$hash = crypt($password, $salt);
echo "暗号化されたパスワードはです: " . $hash;
パスワード検証にcrypt()を使用する場合、ユーザー入力は、以下などの元のハッシュとともにcrypt()に渡す必要があります。
function verifyPassword($password, $hash) {
return crypt($password, $hash) === $hash;
}
これにより、検証プロセスが同じアルゴリズムと塩値を使用することが保証されます。
未知の塩値を持つ文字列を手動で指定しないでください。プログラムによって自動的に生成された安全な塩値を使用してください。
それらがまだサポートされていても、 DESまたはMD5の使用は避けてください。
Password_hash()およびpassword_verify()への優先的な移行、これらの関数はPHPによって維持され、モダンな攻撃に抵抗することができるアルゴリズムと塩値を自動的に処理します。
ユーザーが登録すると、古いシステムはパスワードを保存します。
$password = $_POST['password'];
$salt = generateSalt(12);
$hashed = crypt($password, $salt);
// 保存 $hashed データベースに移動します
ログインするときにパスワードを確認してください。
$input = $_POST['password'];
$stored_hash = getPasswordFromDatabase(); // データベースから取得されたと仮定します
if (verifyPassword($input, $stored_hash)) {
echo "正常にログインします";
} else {
echo "エラーパスワード";
}
Crypt()関数はもはや最新のPHPで好ましいツールではありませんが、特に古いシステムを維持する場合、そのアルゴリズムと塩の価値メカニズムを理解することが依然として重要です。互換性とセキュリティのバランスを確保するために、安全に生成された塩値を備えたブローフィッシュ( $ 2Y $ )アルゴリズムを使用することをお勧めします。また、よりモダンで安全なソリューションである長期的には、システムをpassword_hash()に遷移させることもお勧めします。