ハッシュ時に crypt() が使用するアルゴリズムがわかりません。PHPのマニュアルを見ましたが、利用可能なものは何でも使用すると書かれています。しかし、それがどちらを使用しているかをどのように知ることができますか? 現在、開発環境としてMAMPを使用していますが、PHPのステートメントで調べる方法があるはずです。
1 に答える
アルゴリズムはソルト文字列の一部として指定します。たとえば、で開始すると$2a$
、Blowfish cypher が得られます。使用しようとしているアルゴリズムがマシンでサポートされていない場合、意味のある結果は得られません。などの事前定義された定数を確認することで、どのアルゴリズムがサポートされているかを事前に調べることができますが、少なくとも PHP 5.2 では定数とが常に定義されCRYPT_BLOWFISH
ているとは限らないことに気付きました。PHP 5.3 以降、PHP にはアルゴリズムの独自の実装があるため、PHP 5.2 以前の場合のように、PHP コンパイル時にシステムが利用できるものは問題ではありません。PHP 5.2 の Suhosin パッチは、少なくとも Blowfish を追加すると思われますが、その実装は PHP 5.3 で使用されているものと互換性がないようです。CRYPT_SHA256
CRYPT_SHA512
関数のPHP ドキュメントにはcrypt()
、salt 文字列を使用して使用するアルゴリズムを指定する方法に関する情報が記載されています。
- CRYPT_STD_DES - アルファベット "./0-9A-Za-z" の 2 文字のソルトを使用した標準の DES ベースのハッシュ。ソルトで無効な文字を使用すると、crypt() が失敗します。
- CRYPT_EXT_DES - 拡張 DES ベースのハッシュ。「salt」は、アンダースコアとそれに続く 4 バイトの繰り返しカウントと 4 バイトのソルトで構成される 9 文字の文字列です。これらは、印刷可能な文字として、1 文字あたり 6 ビット、最下位文字が最初にエンコードされます。0 ~ 63 の値は、「./0-9A-Za-z」としてエンコードされます。ソルトで無効な文字を使用すると、crypt() が失敗します。
- CRYPT_MD5 - $1$ で始まる 12 文字のソルトによる MD5 ハッシュ
- CRYPT_BLOWFISH - 「$2a$」、2 桁のコスト パラメータ、「$」、およびアルファベットの 22 桁「./0-9A-Za-z」のソルトを使用したフグのハッシュ。この範囲外の文字をソルトで使用すると、crypt() は長さ 0 の文字列を返します。2 桁のコスト パラメータは、基盤となる Blowfish ベースのハッシュ アルゴリズムの反復回数の 2 を底とする対数であり、04 ~ 31 の範囲内である必要があります。この範囲外の値を指定すると、crypt() が失敗します。
- CRYPT_SHA256 - $5$ で始まる 16 文字のソルトを持つ SHA-256 ハッシュ。ソルト文字列が「rounds=$」で始まる場合、N の数値は、Blowfish のコスト パラメータと同様に、ハッシュ ループを実行する回数を示すために使用されます。デフォルトのラウンド数は 5000 で、最小は 1000、最大は 999,999,999 です。この範囲外の N を選択すると、最も近い制限に切り捨てられます。
- CRYPT_SHA512 - $6$ で始まる 16 文字のソルトを持つ SHA-512 ハッシュ。ソルト文字列が「rounds=$」で始まる場合、N の数値は、Blowfish のコスト パラメータと同様に、ハッシュ ループを実行する回数を示すために使用されます。デフォルトのラウンド数は 5000 で、最小は 1000、最大は 999,999,999 です。この範囲外の N を選択すると、最も近い制限に切り捨てられます。
したがって、文字列「password」を Blowfish を使用して 2^10 回繰り返してハッシュするように指定するには、次のようにします。
crypt('password', '$2a$10$XA86t7EJ0xD9OYEUbnTulT');
で始まる文字列XA86
はソルトです。
最後に、より多くの例が必要な場合、またはこのパスワード互換性ビジネスをすべて処理する何かが必要な場合は、phpassをご覧ください。それはパブリックドメインであり、私の経験ではうまく機能します。複数のシステムと互換性のあるハッシュが必要であると指定しない限り、システムで「最適な」アルゴリズムが自動的に使用されます。その場合、(私は思うに) MD5 を使用します。