現在の位置: ホーム> 最新記事一覧> subst()を使用してphpのcrypt()関数の塩部分を抽出して検証する方法は?

subst()を使用してphpのcrypt()関数の塩部分を抽出して検証する方法は?

M66 2025-07-20

PHPでは、 crypt()関数は、指定された「塩」を使用してパスワードのセキュリティを強化する一般的に使用されるパスワードハッシュツールです。塩の機能は、ハッシュのランダム性を高め、虹のテーブル攻撃を防ぐことです。 Crypt()関数によって生成されたハッシュから塩を抽出して検証する方法を理解することは、パスワード処理セキュリティのマスタリングの重要な部分です。

この記事では、phpのsubst()関数を使用してcrypt()の戻り値から塩部分を抽出し、それの簡単な検証を実行する方法を紹介します。

塩とは?

塩は、暗号化されたときに元のパスワードと組み合わせるランダムな文字列です。両方のユーザーのパスワードが同じであっても、生成されたハッシュ値が異なることが保証されます。

crypt()関数では、塩の形式と長さは、暗号化アルゴリズムなど、次のように異なります。

  • DES :2文字の塩

  • MD5$ 1 $から始めて、その後最大8文字の塩が続きます

  • ブローフィッシュ$ 2A $または$ 2Y $から始めて、2桁のコストファクターと22文字の塩が続きます

substr()で塩を抽出する方法

MD5アルゴリズムを使用しているとしたら、その塩形式が次のとおりです。

 $1$ + 8キャラクターソルト

たとえば、典型的なMD5ハッシュ値:

 $hash = crypt('password', '$1$abcdefgh$');

返されたハッシュは次のとおりです。

 $1$abcdefgh$ZxR0LnxZPbQ5Cj7JlYiGp0

塩は最初の12文字です: $ 1 $ abcdefgh $

substr()で塩サンプルコードを抽出します

<?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()を使用して、ハッシュから塩部分を簡単に抽出します。

  • 正規表現で塩形式を検証することで、塩が暗号化アルゴリズムの要件を満たし、セキュリティを改善することを確認できます。