PHP crypt()関数


PHP String 参考手册PHP String リファレンスマニュアル

定義と用法

crypt() 関数は、DES、Blowfish、または MD5 アルゴリズムを使用して暗号化された文字列を返します。

オペレーティングシステムによって、この関数の動作は異なります。一部のオペレーティングシステムは、複数のアルゴリズムタイプをサポートしています。インストール時に、PHP はどのアルゴリズムが利用可能で、どのアルゴリズムを使用するかを確認します。

正確なアルゴリズムは、salt パラメータの形式と長さに依存します。salt は、特定の文字列と特定の暗号化方式によって生成される文字列の数を増やすことで、暗号化をより安全にすることができます。

ここに crypt() 関数と一緒に使用される定数があります。これらの定数値はインストール時に PHP によって設定されます。

定数:

  • [CRYPT_SALT_LENGTH] - デフォルトの暗号化長。標準の DES 暗号化を使用する場合、長さは 2
  • [CRYPT_STD_DES] - 標準の DES ベースの暗号化には、アルファベット "./0-9A-Za-z" からなる 2 文字の salt があります。salt に無効な文字を使用すると、関数は失敗します。
  • [CRYPT_EXT_DES] - 拡張 DES ベースの暗号化には、9 文字の salt があり、1 つのアンダースコア、それに続く 4 バイトの反復回数と 4 バイトの salt で構成されます。これらは印字可能文字としてエンコードされ、各文字 6 ビットで、最下位文字が優先されます。値 0 から 63 は "./0-9A-Za-z" としてエンコードされます。salt に無効な文字を使用すると、関数は失敗します。
  • [CRYPT_MD5] - MD5 暗号化には 12 文字の salt があり、$1$ で始まります。
  • [CRYPT_BLOWFISH] - Blowfish 暗号化には、$2a$、$2x$、または $2y$ で始まる salt、2 桁のコストパラメータ "$"、およびアルファベット "./0-9A-Za-z" からの 22 文字があります。アルファベット以外の文字を使用すると、関数は長さ 0 の文字列を返します。"$" パラメータは、Blowfish ハッシュアルゴリズムの反復回数の 2 を底とする対数であり、04-31 の範囲内である必要があります。この範囲外の値は関数を失敗させます。
  • [CRYPT_SHA_256] - SHA-256 暗号化には 16 文字の salt があり、$5$ で始まります。salt 文字列が "rounds=<N>$" で始まる場合、N の数値はハッシュループが実行される回数を示し、Blowfish のコストパラメータと似ています。デフォルトのループ回数は 5000、最小値は 1000、最大値は 999,999,999 です。この範囲外の N の値は、最も近い境界値に変換されます。
  • [CRYPT_SHA_512] - SHA-512 暗号化には 16 文字の salt があり、$6$ で始まります。salt 文字列が "rounds=<N>$" で始まる場合、N の数値はハッシュループが実行される回数を示し、Blowfish のコストパラメータと似ています。デフォルトのループ回数は 5000、最小値は 1000、最大値は 999,999,999 です。この範囲外の N の値は、最も近い境界値に変換されます。

この関数が複数のアルゴリズムをサポートするシステムでは、上記の定数はサポートされていれば "1" に設定され、それ以外の場合は "0" に設定されます。

注釈:対応する復号化関数はありません。crypt() 関数は一方向アルゴリズムを使用します。


構文

crypt(str,salt)

パラメータ 説明
str 必須です。エンコードする文字列を指定します。
salt オプションです。エンコードされる文字数を増やして、エンコードをより安全にするための文字列です。salt パラメータが指定されていない場合、関数が呼び出されるたびにランダムに生成されます。

技術詳細

戻り値: 暗号化された文字列を返します。失敗した場合は、13 文字未満で salt とは異なることが保証された文字列を返します。
PHP バージョン: 4+
変更履歴: PHP 5.3.7 で、潜在的な上位ビット攻撃を処理するために $2x$ および $2y$ Blowfish モードが追加されました。

PHP 5.3.2 で、定数 SHA-256 および SHA-512 が追加されました。

PHP 5.3.2 以降、Blowfish は無効なラウンドで "failure" 文字列("*0" または "*1")を返し、DES にフォールバックしません。

PHP 5.3.0 以降、PHP には MD5 暗号化実装、標準 DES 実装、拡張 DES 実装、および Blowfish アルゴリズムが組み込まれています。システムが上記のアルゴリズムをサポートしていない場合、PHP に組み込まれたアルゴリズム実装が使用されます。


例

例 1

<?php $hashed_password = crypt('mypassword'); //自動生成される salt 値 /*crypt() によって得られた完全な結果を salt 値としてパスワード検証に使用し、異なるハッシュアルゴリズムの使用によって引き起こされる問題を回避する必要があります。(上記のように、標準 DES アルゴリズムに基づくパスワードハッシュは 2 文字の salt 値を使用しますが、MD5 アルゴリズムに基づくハッシュは 12 文字の salt 値を使用します。)*/ if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Password verified!"; } ?>

例 2

htpasswd を使用した crypt() 暗号化:

<?php //パスワードを設定する $password = 'mypassword'; //ハッシュ値を取得し、自動 salt 値を使用する $hash = crypt($password); ?>

例 1

この例では、さまざまなハッシュタイプを使用しています:

<?php if (CRYPT_STD_DES == 1) { echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n"; } if (CRYPT_EXT_DES == 1) { echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n"; } if (CRYPT_MD5 == 1) { echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n"; } if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA256 == 1) { echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA512 == 1) { echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n"; } ?>

上記のコードは次のように出力されます(オペレーティングシステムによって異なります):

Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:     $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21



PHP String 参考手册PHP String リファレンスマニュアル その他の拡張