PHP crypt()関数

定義と使用法

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

異なるオペレーティングシステム上で、この関数の動作は異なります。一部のオペレーティングシステムは、1種類以上のアルゴリズムタイプをサポートしています。インストール時にPHPは、利用可能なアルゴリズムとそれを使用するアルゴリズムをチェックします。

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

ここにはcrypt()関数と一緒に使用されるいくつかの定数があります。これらの定数の値は、インストール時にPHPで設定されます。

定数:

[CRYPT_SALT_LENGTH] デフォルトの暗号化長さ。標準のDES暗号化を使用して、長さが2です。
[CRYPT_STD_DES] 標準のDESアルゴリズムに基づくハッシュは、"./0-9A-Za-z"文字の2文字を使用してシート値として使用します。シート値に非法な文字を使用するとcrypt()が失敗します。
[CRYPT_EXT_DES] DESアルゴリズムに基づく拡張ハッシュ。シートは9文字の文字列で、下線の後ろに4バイトのループ回数と4バイトのシート値が続きます。それらは印刷可能な文字にエンコードされ、各文字は6ビットで、有効ビットが最も少ないものが優先されます。0から63は"./0-9A-Za-z"にエンコードされます。シート値に非法な文字を使用するとcrypt()が失敗します。
[CRYPT_MD5] MD5 ハッシュ化は「$1」で始まる12文字の文字列のソルトを使用します。
[CRYPT_BLOWFISH] Blowfish アルゴリズムは以下のソルトを使用します:「$2a$」、2桁のcostパラメータ、「$」、および「./0-9A-Za-z」の文字からなる64桁の文字列。ソルトにこの範囲の外の文字を使用すると、crypt()が空文字列を返します。2桁のcostパラメータはループ回数を2で対数した値で、範囲は04-31です。この範囲を超える場合、crypt()は失敗します。
CRYPT_SHA256 SHA-256 アルゴリズムは「$5」で始まる16文字の文字列のソルトを使用してハッシュ化します。ソルト文字列が「rounds=<N>$」で始まる場合、Nの数字値はハッシュ化ループの実行回数を指定します。これはBlowfishアルゴリズムのcostパラメータに似ています。デフォルトのループ回数は5000で、最小は1000、最大は999,999,999です。この範囲を超えるNは最も近い値に変換されます。
CRYPT_SHA512 SHA-512 アルゴリズムは「$6」で始まる16文字の文字列のソルトを使用してハッシュ化します。ソルト文字列が「rounds=<N>$」で始まる場合、Nの数字値はハッシュ化ループの実行回数を指定します。これはBlowfishアルゴリズムのcostパラメータに似ています。デフォルトのループ回数は5000で、最小は1000、最大は999,999,999です。この範囲を超えるNは最も近い値に変換されます。

この関数がサポートするシステム上で、上記の定数がサポートされている場合には「1」に設定し、そうでない場合には「0」に設定します。

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

文法

crypt(str,salt)
パラメータ 説明
str 必須。暗号化する文字列を指定します。
salt オプション。暗号化する文字列の数を増やし、暗号をより安全にするために使用される文字列です。salt パラメータが提供されない場合、PHPは呼び出しごとにランダムに生成します。

技術的詳細

返却値: 暗号化された文字列または13文字未満の文字列を返却し、失敗時にはソルトと区別するために使用します。
PHP バージョン: 4+

更新日志

バージョン 説明
5.3.2 Ulrich Drepperの実装に基づいて、SHA-256 アルゴリズムおよび SHA-512 アルゴリズムに基づく cryptが追加されました。
5.3.2 Blowfish アルゴリズムの問題を修正しました。無効なループにより「失敗」文字列(「*0」または「*1」)が返され、DES アルゴリズムに切り替わるのではなくなりました。
5.3.0 PHP は現在、MD5 Crypt 実装を含み、標準 DES アルゴリズム、拡張 DES アルゴリズム、Blowfish アルゴリズムを含んでいます。システムに対応する実装が不足している場合、PHP は自分自身の実装を使用します。

例 1

この例では、異なるアルゴリズムをテストします:

<?php
// 2文字の salt
if (CRYPT_STD_DES == 1)
{
echo "標準 DES: ".crypt('something','st')."\n<br>";
}
else
{
echo "標準 DES はサポートされていません。\n<br>";
}
// 4文字の salt
if (CRYPT_EXT_DES == 1)
{
echo "拡張 DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo "拡張 DES はサポートされていません。\n<br>";
}
// $1$ で始まる 12文字
if (CRYPT_MD5 == 1)
{
echo "MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo "MD5 はサポートされていません。\n<br>";
}
// $2a$ で始まる Salt。二桁のコストパラメータ:09。22文字
if (CRYPT_BLOWFISH == 1)
{
echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo "Blowfish DES はサポートされていません。\n<br>";
}
// $5$ で始まる 16 文字の salt。デフォルトの回数は 5000。
if (CRYPT_SHA256 == 1)
{
echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>";
else
{
echo "SHA-256 not supported.\n<br>";
}
// $5$ で始まる 16 文字の salt。デフォルトの回数は 5000。
if (CRYPT_SHA512 == 1)
{
echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$');
}
else
{
echo "SHA-512 not supported.";
}
?>

上記のコードの出力(オペレーティングシステムに依存):

標準DES: stqAdD7zlbByI
拡張DES: _S4..someQXidlBpTUu6
MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w.
Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu
SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9
SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/
oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.