PHPでは、 crypt()関数は、指定された「塩」を使用してパスワードのセキュリティを強化する一般的に使用されるパスワードハッシュツールです。塩の機能は、ハッシュのランダム性を高め、虹のテーブル攻撃を防ぐことです。 Crypt()関数によって生成されたハッシュから塩を抽出して検証する方法を理解することは、パスワード処理セキュリティのマスタリングの重要な部分です。
この記事では、phpのsubst()関数を使用してcrypt()の戻り値から塩部分を抽出し、それの簡単な検証を実行する方法を紹介します。
塩は、暗号化されたときに元のパスワードと組み合わせるランダムな文字列です。両方のユーザーのパスワードが同じであっても、生成されたハッシュ値が異なることが保証されます。
crypt()関数では、塩の形式と長さは、暗号化アルゴリズムなど、次のように異なります。
DES :2文字の塩
MD5 : $ 1 $から始めて、その後最大8文字の塩が続きます
ブローフィッシュ: $ 2A $または$ 2Y $から始めて、2桁のコストファクターと22文字の塩が続きます
MD5アルゴリズムを使用しているとしたら、その塩形式が次のとおりです。
$1$ + 8キャラクターソルト
たとえば、典型的なMD5ハッシュ値:
$hash = crypt('password', '$1$abcdefgh$');
返されたハッシュは次のとおりです。
$1$abcdefgh$ZxR0LnxZPbQ5Cj7JlYiGp0
塩は最初の12文字です: $ 1 $ abcdefgh $
<?php
$hash = crypt('password', '$1$abcdefgh$');
// 抽出された塩の長さはです12文字
$salt = substr($hash, 0, 12);
echo "抽出された塩はです: " . $salt;
?>
抽出された塩が正規表現を通して期待を満たしていることを確認できます。たとえば、md5塩の正規表現:
/^(\$1\$[\.\/0-9a-zA-Z]{1,8}\$)$/
サンプルコード:
<?php
$salt = substr($hash, 0, 12);
if (preg_match('/^\$1\$[\.\/0-9a-zA-Z]{1,8}\$/', $salt)) {
echo "正しい塩形式";
} else {
echo "間違った塩形式";
}
?>
以下は、ハッシュの生成、塩の抽出、塩の検証を含む完全な例です。
<?php
$password = 'mypassword';
// 使用 MD5 アルゴリズムは塩を生成します($1$ + 8ランダムな文字 + $)
$salt = '$1$' . substr(strtr(base64_encode(random_bytes(6)), '+', '.'), 0, 8) . '$';
// ハッシュを生成します
$hash = crypt($password, $salt);
echo "生成されたハッシュ: $hash\n";
// ハッシュから塩を抽出します
$extracted_salt = substr($hash, 0, 12);
echo "抽出された塩: $extracted_salt\n";
// 塩の形式を確認します
if (preg_match('/^\$1\$[\.\/0-9a-zA-Z]{1,8}\$/', $extracted_salt)) {
echo "塩形式の検証が合格しました\n";
} else {
echo "塩形式の検証に失敗しました\n";
}
?>
Crypt()関数の塩形式は、異なる長さと構造を持つ暗号化アルゴリズムに関連しています。
substr()を使用して、ハッシュから塩部分を簡単に抽出します。
正規表現で塩形式を検証することで、塩が暗号化アルゴリズムの要件を満たし、セキュリティを改善することを確認できます。