目次
PHPのcrypt関数でソルト付きのパスワードハッシュを生成する方法
crypt関数を使用することで、ソルトやストレッチングを実施したパスワードのハッシュ値を生成することができます。
crypt関数の引数は次の通りです。戻り値はハッシュ値の文字列が返却されます。
引数 | 型 | 説明 |
第一引数 | string | パスワードの文字列 |
第二引数 | string | ソルト(任意)第二引数を省略するとソルトやストレッチングが実装されない。PHP 5.6 以降では第二引数を省略するとE_NOTICE が発生。 |
スポンサーリンク
crypt関数がサポートしているハッシュアルゴリズムのは次の通りです。
アルゴリズム | 説明 |
CRYPT_SHA256 | SHA-256のハッシュ関数を使用。$5$ で始まり コストパラメータと 16 文字の salt よりハッシュ値を生成。 |
CRYPT_SHA512 | SHA-512のハッシュ関数を使用。$6$ で始まり コストパラメータと 16 文字の salt よりハッシュ値を生成。 |
CRYPT_BLOWFISH | Blowfish暗号を使用。 $2a$、$2x$、$2y$のいずれかで始まりコストパラメータと 22 文字のsaltよりハッシュ値を生成。 |
CRYPT_MD5 | MD5のハッシュ関数を使用。$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