PHP

【PHP】crypt関数でソルト付きのパスワードハッシュを生成する

2020年5月9日

PHPのcrypt関数でソルト付きのパスワードハッシュを生成する方法

crypt関数を使用することで、ソルトストレッチングを実施したパスワードのハッシュ値を生成することができます。

crypt関数の引数は次の通りです。戻り値はハッシュ値の文字列が返却されます。

引数説明
第一引数stringパスワードの文字列
第二引数stringソルト(任意)第二引数を省略するとソルトやストレッチングが実装されない。PHP 5.6 以降では第二引数を省略するとE_NOTICE が発生。

スポンサーリンク

 

crypt関数がサポートしているハッシュアルゴリズムのは次の通りです。

アルゴリズム説明
CRYPT_SHA256SHA-256のハッシュ関数を使用。$5$ で始まり コストパラメータと 16 文字の salt よりハッシュ値を生成。
CRYPT_SHA512SHA-512のハッシュ関数を使用。$6$ で始まり コストパラメータと 16 文字の salt よりハッシュ値を生成。
CRYPT_BLOWFISHBlowfish暗号を使用。 $2a$、$2x$、$2y$のいずれかで始まりコストパラメータと 22 文字のsaltよりハッシュ値を生成。
CRYPT_MD5MD5のハッシュ関数を使用。$1$ で始まり 8 文字の salt を使いハッシュ値を生成。
CRYPT_STD_DES標準の DES暗号を使用。 2 文字の salt を使いハッシュ値を生成。
CRYPT_EXT_DES拡張した DES 暗号を使用。アンダースコアから始まる9文字の salt を使いハッシュ値を生成。

SHA-256のハッシュ値を生成

crypt関数で生成したSHA-256のハッシュ値は「$5$」で始まり、16文字のソルトを付与することができます

第二引数のソルトが「rounds=<N>$」で始まる場合、Nはハッシュループの実行回数(ストレッチング回数)を表します。rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定します。

【実装例】

echo crypt('テスト1', '$5$rounds=5000$7VRXjNci58C1xKu1');

【実行結果】

$5$rounds=5000$7VRXjNci58C1xKu1$iKUQcRA0QTyRrh1vdVWopy/m76PEggOWIF0EZbkUzw6

ハッシュ値は「$」区切りで次のような構成で生成されます。

  • アルゴリズム(SHA-256):5
  • ハッシュループの実行回数:rounds=5000
  • ソルト:7VRXjNci58C1xKu1
  • 生成されたハッシュ値:iKUQcRA0QTyRrh1vdVWopy/m76PEggOWIF0EZbkUzw6

SHA-512のハッシュ値を生成

crypt関数で生成したSHA-512のハッシュ値は「$6$」で始まり、16文字のソルトを付与することができます。

第二引数のソルトが「rounds=<N>$」で始まる場合、Nはハッシュループの実行回数(ストレッチング回数)を表します。rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定します。

【実装例】

echo crypt('テスト1', '$6$rounds=5000$7VRXjNci58C1xKu1');

【実行結果】

$6$rounds=5000$7VRXjNci58C1xKu1$EYtILXbjhYXCpITvkHOgVk9DViG2sKaW19J8o5EWUjlOgoWfUbe8oNR9XAN4PXFwTdYFdnNE8XMlbPVyOqD4u0

ハッシュ値は「$」区切りで次のような構成で生成されます。

  • アルゴリズム(SHA-512):6
  • ハッシュループの実行回数:rounds=5000
  • ソルト:7VRXjNci58C1xKu1
  • 生成されたハッシュ値:EYtILXbjhYXCpITvkHOgVk9DViG2sKaW19J8o5EWUjlOgoWfUbe8oNR9XAN4PXFwTdYFdnNE8XMlbPVyOqD4u0

スポンサーリンク

Blowfishのハッシュ値を生成

crypt関数で生成したBlowfishのハッシュ値は「$2a$」「$2x$」「$2y$」のいずれかで始まり、2桁のコストパラメータと22文字のソルトを付与することができます。

また、Blowfishのハッシュ値はpassword_hash関数でも生成することができます。

password_hash関数については以下の記事をご覧ください。

【実装例】

echo crypt('テスト1', '$2y$10$mOqouj.7VRXjNci58C1xKu');

【実行結果】

$2y$10$mOqouj.7VRXjNci58C1xKuQ0OSAgyiPARQmaBKbxAL.aJbUnno2cW

ハッシュ値は「$」区切りで次のような構成で生成されます。

  • bcryptのバージョン:2y
  • コストパラメータ:10
  • ソルト:mOqouj.7VRXjNci58C1xKu
  • 生成されたハッシュ値:Q0OSAgyiPARQmaBKbxAL.aJbUnno2cW

コストパラメータ(ストレッチング回数)の数字は、2のn乗のn部分を示しているので、今回は2の10乗で1024回 ストレッチングが実施されています。

MD5のハッシュ値を生成

crypt関数で生成したMD5のハッシュ値は「$1$」で始まり、8文字のソルトを付与することができます

【実装例】

echo crypt('テスト1', '$1$7VRXjNci');

【実行結果】

$1$7VRXjNci$SI7hnvSPz23YQDfgZrTKH1

ハッシュ値は「$」区切りで次のような構成で生成されます。

  • アルゴリズム(MD5):1
  • ソルト:7VRXjNci
  • 生成されたハッシュ値:SI7hnvSPz23YQDfgZrTKH1

標準のDESのハッシュ値を生成

crypt関数で生成する標準DESのハッシュ値には、2文字のソルトを付与することができます

【実装例】

echo crypt('テスト1', '7V');

【実行結果】

7Vlxlr.lJuqlI

拡張したDESのハッシュ値を生成

crypt関数で生成する拡張DESのハッシュ値には、アンダースコアから始まる9文字のソルトを付与することができます

【実装例】

echo crypt('テスト1', '_7VRXjNci');

【実行結果】

_7VRXjNciM7In/AlhFAI

helpful