(PHP 4, PHP 5)
crypt — 文字列の一方向のハッシュ化を行う
crypt() 文字列のハッシュを返します。 Unix 標準の DES ベースのアルゴリズムか、 あるいはシステム上で使えるその他のアルゴリズムを使用します。
複数のハッシュ方式をサポートしているオペレーティングシステムもあります。 実際、標準の DES ベースのアルゴリズムを MD5 ベースのものに置き換えることもあります。 ハッシュ方式は、salt 引数によって決まります。 PHP 5.3 より前のバージョンでは、PHP のインストール時に、 システムの crypt() 関数から使用できるアルゴリズムを判別します。 salt を省略した場合は、標準の 2 文字 (DES) の salt を自動生成します。 あるいは、MD5 crypt() が使えれば 12 文字 (MD5) の salt を自動生成します。 PHP の定数 CRYPT_SALT_LENGTH には、 ハッシュで使用できる salt の最大長が格納されています。
標準の DES ベースの場合、crypt() は出力の最初の 2 文字を salt として使用します。また、 str の最初の 8 文字しか使用しません。 つまり、最初の 8 文字が同じである長い文字列は、 同じ salt を使う限り同じ結果となります。
crypt() が複数のハッシュ方式をサポートしているシステムでは、 その方式が使用可能かどうかによって次の定数群が 0 か 1 に設定されます。
注意:
PHP 5.3.0 以降、PHP 自身にもそれぞれの実装が含まれるようになりました。 システム側でそのアルゴリズムがサポートされていない場合にこの実装を使用します。
ハッシュしたい文字列。
ハッシュのもととなる salt 文字列。省略した場合の挙動は アルゴリズムの実装によって決まるので、予期せぬ結果となることがあり得ます。
ハッシュした文字列を返します。 失敗した場合は、salt とは異なることが保証されている 13 文字未満の文字列を返します。
バージョン | 説明 |
---|---|
5.3.2 | SHA-256 および SHA-512 による暗号化が追加されました。Ulrich Drepper の » 実装 を使っています。 |
5.3.2 | Blowfish で無効な rounds を指定したときに、DES に切り替えるのではなく "failure" 文字列 ("*0" あるいは "*1") を返すようになりました。 |
5.3.0 | PHP に MD5 crypt, Standard DES, Extended DES および Blowfish の実装が含まれるようになりました。システム側でこれらのアルゴリズムがサポートされていない場合に、 この実装を使用します。 |
例1 crypt() の例
<?php
$password = crypt('mypassword'); // saltを自動的に生成させます
/* 異なったハッシュアルゴリズムが使用された際の問題を避けるために
crypt()の結果全体をパスワード比較用のsaltとして渡す必要があります。
(上記のように標準DESに基づくパスワードハッシュは2文字のsaltを使用します
が、MD5に基づくハッシュは12文字のsaltを使用します) */
if (crypt($user_input, $password) == $password) {
echo "Password verified!";
}
?>
例2 crypt() を htpasswd で使用する例
<?php
// パスワードを設定します
$password = 'mypassword';
// ハッシュを取得します。salt は自動生成させます
$hash = crypt($password);
?>
例3 異なるハッシュ形式を用いた crypt() の例
<?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
注意: 復号するための関数はありません。 crypt() が使用しているのは単方向アルゴリズムだからです。