PHPでは、 Crypt()関数は一般的に使用される暗号化関数であり、特にパスワードストレージを扱う場合、主に一方向で文字列を暗号化するために使用されます。この記事では、Crypt()関数のパラメーターを詳細に解析し、PHPのCrypt()関数を使用して文字列を安全に暗号化する方法を例で示します。
Crypt()は、PHPに組み込みの暗号化関数であり、UnixのCrypt()関数に基づいて実装されています。さまざまな暗号化アルゴリズム(DES、MD5、BlowFish、SHA-256、SHA-512など)を使用して、入力文字列を暗号化し、暗号化された文字列を返します。
関数プロトタイプ:
string crypt ( string $str [, string $salt ] )
$ str :暗号化する必要がある文字列、通常はパスワードです。
$ SALT (オプション):暗号化アルゴリズムと塩漬けの文字列を指定するために使用されます。異なる塩が暗号化アルゴリズムと結果を決定します。
これは、暗号化されるプレーンテキスト文字列であり、通常はユーザーのパスワードです。
塩パラメーターは、暗号化アルゴリズムと結果を決定するための鍵です。塩の異なる形式は、異なるアルゴリズムを表します。
デフォルトの暗号化<br> 2文字の長さの塩、たとえば「AB」
これは、セキュリティが弱いため、最もオリジナルの暗号化方法であり、推奨されません。
md5暗号化<br> $ 1 $から始めて、最大8文字の塩が続きます。たとえば、 「$ 1 $ m66net12 $」
これは、MD5アルゴリズムを使用して暗号化されます。
ブローフィッシュ暗号化<br> $ 2A $ 、 $ 2Y $ 、 $ 2B $などから始めて、2桁のコスト係数と22桁の塩を表す2桁の番号など、たとえば「$ 2Y $ 10 $ 10 $ M66NETSALTSALTSALTSALTSALTSA $」
Blowfishは比較的安全なアルゴリズムです。
SHA-256暗号化<br> $ 5 $から始めてから塩、たとえば「$ 5 $ m66net $」
SHA-512暗号化<br> $ 6 $から始めてから塩、たとえば「$ 6 $ m66net $」
// MD5 塩の例
$salt_md5 = '$1$m66net12$';
// Blowfish 塩の例,10 それはコスト要因です(cost factor)
$salt_blowfish = '$2y$10$m66netsaltsaltsaltsa$';
// SHA-256 塩の例
$salt_sha256 = '$5$m66net$';
// SHA-512 塩の例
$salt_sha512 = '$6$m66net$';
以下は、crypt()関数を使用して文字列を暗号化する方法を示すいくつかの例です。
$password = "mypassword";
$salt = "m6"; // 2キャラクターソルト
$hashed = crypt($password, $salt);
echo "DES暗号化の結果:" . $hashed;
$password = "mypassword";
$salt = '$1$m66net12$'; // による $1$ 最初の塩
$hashed = crypt($password, $salt);
echo "MD5暗号化の結果:" . $hashed;
$password = "mypassword";
$salt = '$2y$10$m66netsaltsaltsaltsa$'; // Blowfish,料金10
$hashed = crypt($password, $salt);
echo "Blowfish暗号化の結果:" . $hashed;
$password = "mypassword";
$salt = '$6$m66net$';
$hashed = crypt($password, $salt);
echo "SHA-512暗号化の結果:" . $hashed;
パスワードを暗号化した後、検証するときに入力したパスワードを同じ塩で再暗号化し、結果が同じかどうかを比較します。
// データベースにパスワードハッシュが保存されたと仮定します
$stored_hash = '$6$m66net$........'; // 从数据库取出的暗号化の結果
// ユーザーがログインするとパスワードが入力されました
$input_password = "mypassword";
// 塩を取り除きます,いつもの stored_hash 最初のいくつかの部分,特定の長さはアルゴリズムに依存します
$salt = substr($stored_hash, 0, strrpos($stored_hash, '$') + 1);
// 同じ塩でパスワードを再クリップします
$input_hash = crypt($input_password, $salt);
if ($input_hash === $stored_hash) {
echo "パスワード検証が成功しました";
} else {
echo "パスワード検証に失敗しました";
}
Crypt()関数は、さまざまな暗号化アルゴリズムをサポートし、塩パラメーターによって決定されます。
ブローフィッシュ( $ 2Y $ )またはSHA-512( $ 6 $ )アルゴリズムを使用することをお勧めします。
塩はランダムで一意でなければならず、正しい形式でなければなりません。
パスワード検証の場合、暗号化されたハッシュ値の塩を使用してパスワードを再度暗号化し、比較します。