crypt

関数の概要

PHPの crypt 関数は、文字列を一方向ハッシュ化するために使われます。主にパスワードのハッシュ化に利用されており、ソルト(salt)という付加情報を組み合わせることで、単純なハッシュ化よりも安全な結果を生成します。パスワードの保存や検証に役立つ関数です。

パラメータの説明

  • string $str — ハッシュ化したい元の文字列(パスワードなど)
  • string|null $salt — ハッシュを生成する際のソルト。オプションで省略可能ですが、指定しないとセキュリティが低下します。特定のフォーマットのソルトを使うことで様々なアルゴリズムに対応可能です。

戻り値

成功するとフォーマットされたハッシュ文字列を返します。失敗した場合は false を返します。このハッシュは、後で元の文字列と比較するときに利用します。

使用例

基本的な使い方

$password = "mypassword";
$hash = crypt($password, "salt");
echo $hash;

この例では単純に「salt」というソルトを使って文字列をハッシュ化していますが、安全なハッシュ化には適しません。

安全なソルトの例(DES形式)

$password = "mypassword";
$salt = substr(str_replace('+', '.', base64_encode(random_bytes(2))), 0, 2); // 2文字のランダムソルト
$hash = crypt($password, $salt);
echo $hash;

2文字の乱数ソルトを用いることで、DESベースのcryptのセキュリティを向上させますが、現代の基準ではより強力なアルゴリズムを推奨します。

モダンなアルゴリズムを使った例(SHA-256)

$password = "mypassword";
$salt = '$5$' . substr(base64_encode(random_bytes(16)), 0, 16); // SHA-256アルゴリズムの識別子とソルト
$hash = crypt($password, $salt);
echo $hash;

ここでは SHA-256 アルゴリズムを使い、16文字のランダムなソルトを設定しています。より安全なハッシュの生成が可能です。

パスワード検証の例

$password = "mypassword";
$stored_hash = crypt($password, '$6$randomsalt'); // 事前に保存されたハッシュ

// 入力されたパスワードが同じかどうかを確認
if (crypt($password, $stored_hash) === $stored_hash) {
    echo "パスワードが正しいです。";
} else {
    echo "パスワードが違います。";
}

元のハッシュのソルト情報を使って再度ハッシュ化し、文字列比較で認証を行います。

関連する関数

  • password_hash — PHP 5.5以降で推奨されるパスワードハッシュ生成関数
  • password_verifypassword_hashで生成したハッシュの検証に使う関数
  • hash — 任意のハッシュアルゴリズムを利用するための関数

まとめ

crypt 関数は、PHPで文字列を一方向にハッシュ化したい場合に役立ちます。ただし、ソルトの指定方法やアルゴリズムに注意しないと安全性が低下するため、正しい使い方が重要です。特に新しいプロジェクトでは、より安全で利便性の高い password_hash 関数の利用を検討することをおすすめします。とはいえ、古いシステムと互換性を保つ際や、カスタム要件に応じて crypt を理解しておくことは重要です。