関数・クラス解説

crypt

version:PHP 4, PHP 5, PHP 7 (公式)

指定された文字列のハッシュ値を返します

注意

password_hash() は crypt() のラッパーです。特別な理由がない限りpassword_hash() の利用を推奨します!

フォーマット

string : crypt ( string $str [, string $salt ] )

パラメータ

string $str (必須)
ハッシュしたい対象の文字列
※CRYPT_BLOWFISH を使うと、 str が最大72文字までに切り詰められます。

string $salt
ハッシュのもととなる salt 文字列。この文字列の指定の仕方によって利用するハッシュ形式が変わります。具体的には、salt の長さ、或いは先頭の数文字に特定の文字列を指定するなどです。
環境(利用できるハッシュ方式)によっては省略可能ですが、crypt() が作るハッシュが脆弱なものとなります。ハッシュ形式については以下の項目も参照してください。
PHP 5.6 以降、このパラメータを省略した場合に E_NOTICE が発生します。

ハッシュ方式の種類
CRYPT_STD_DES
標準のDESベースのハッシュ方式。salt に2文字を指定するとこの方式となる。"./0-9A-Za-z"の範囲内で指定する。範囲外の文字を指定するとハッシュ化に失敗する

CRYPT_EXT_DES
拡張したDESベースのハッシュ方式。アンダースコア _ から始まる9文字を指定するとこの方式となる。

CRYPT_MD5
$1$ ではじまる 12 文字の salt を指定すると、MD5のハッシュとなる。

CRYPT_BLOWFISH
Blowfish 方式。salt は、"$2a$"、"$2x$"、"$2y$" の何れかに続き2 桁のコストパラメータ、"$"、そして文字 "./0-9A-Za-z" からなる 22 文字。範囲外の文字を salt に使うと、長さゼロの文字列を変更する。

CRYPT_SHA256
SHA-256 ハッシュに $5$ で始まる 16 文字の salt を組み合わせたもの。saltに '$5$rounds=5000' と指定した場合、5000回のハッシュループを実行する。

CRYPT_SHA512
SHA-512 ハッシュに $6$ で始まる 16 文字の salt を組み合わせたもの。saltに '$5$rounds=5000' と指定した場合、5000回のハッシュループを実行する。

解説

指定された文字列のハッシュを返却します。salt の形式によってハッシュ方式が決まりますが、利用できるハッシュ化方式は環境に依存します。
ハッシュの指定と利用できるハッシュ方式については上記「ハッシュ方式の種類」の項目を参照してください。
なお、crypt() でハッシュ化された文字列を復号することはできません。

記述サンプル

//PHP 7.4.6で実行

//文字列を指定
$string = 'abcdefg ABCDEFG あいうえおかきくけこ';

echo 'Standard DES: ' . crypt($string, 'a1'). "\n";
echo 'Extended DES: ' . crypt($string, '_pac.test'). "\n";
echo 'MD5: ' . crypt($string, '$1$testhash$'). "\n";
echo 'Blowfish: ' . crypt($string, '$2a$10$testnomojioretsuhash$'). "\n";
echo 'SHA-256: ' . crypt($string, '$5$testnomojioretsuhash$'). "\n";
echo 'SHA-512: ' . crypt($string, '$6$rounds=5000$testnomojioretsuhash$'). "\n";

//結果 
Standard DES: a1HwCW9SrCdyA
Extended DES: _pac.test/Vgn0izkqzs
MD5: $1$testhash$dP.zm4HXca1BP6wLHHrmn.
Blowfish: $2a$10$testnomojioretsuhash$eXvG8zvxK7l0vPtR/QiEN3lAjvvd/89K
SHA-256: $5$testnomojioretsu$l.bhj9g9sFHlP5OIBJs1LjQG9Suy0DPK39jluZnjQh2
SHA-512: $6$rounds=5000$testnomojioretsu$gWB/sYsrzh1dzjL8h.JH2urEG7iVxIE/Qk/GZQK5Ki.KQ.1vm
Je/NCUA16X5hxdbdYMbHYeWVpX8UKjcDlLeh/

/* ----------------------------- */

//各環境情報の取得
echo '利用可能なハッシュ方式: ';
if(CRYPT_STD_DES === 1){
	echo 'Standard_DES ';
}
if(CRYPT_EXT_DES === 1){
	echo 'Extended_DES ';
}
if(CRYPT_MD5 === 1){
	echo 'MD5 ';
}
if(CRYPT_BLOWFISH === 1){
	echo 'Blowfish ';
}
if(CRYPT_SHA256 === 1){
	echo 'SHA-256 ';
}
if(CRYPT_SHA512 === 1){
	echo 'SHA-512';
}

echo '<br>利用可能なsalt の最大長:'.CRYPT_SALT_LENGTH;


/* ----------------------------- */

参考リンク

hash_equals タイミング攻撃に対して安全な文字列比較
password_hash パスワードハッシュを作る
md5 指定した文字列のMD5ハッシュ値を計算する

タグ

crypt ハッシュ String 文字列


公式リファレンス

書式

crypt ( string $str [, string $salt ] ) : string

説明

crypt() 文字列のハッシュを返します。 Unix 標準の DES ベースのアルゴリズムか、 あるいはシステム上で使えるその他のアルゴリズムを使用します。

salt パラメータは必須ではありませんが、これを省略すると crypt() が作るハッシュが弱いものになってしまいます。 PHP 5.6 以降は、このパラメータを省略した場合に E_NOTICE が発生するようになりました。 十分に強いソルトを指定して、セキュリティを確保しましょう。

password_hash() は、強力なハッシュを使い、強力なソルトを生成して、それを複数回自動的に適用します。 password_hash() は crypt() のシンプルなラッパーであり、既存のパスワードハッシュと互換性があります。 password_hash() を使うことを推奨します。

複数のハッシュ方式をサポートしているオペレーティングシステムもあります。 実際、標準の 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 に設定されます。

  • CRYPT_STD_DES - 標準の DES ベースのハッシュで、 アルファベット "./0-9A-Za-z" からなる 2 文字の salt を使用するもの。 salt として無効な文字を使うと crypt() は失敗します。
  • CRYPT_EXT_DES - 拡張した DES ベースのハッシュ。"salt" は 9 文字で、 アンダースコアの後に 4 バイトの反復回数と 4 バイトの salt が続きます。 これらが表示可能な文字にエンコードされます。一文字あたり 6 ビットで、 下位の文字から順に並びます。 0 から 63 までの値は "./0-9A-Za-z" とエンコードされます。 salt に無効な文字を使うと crypt() は失敗します。
  • CRYPT_MD5 - $1$ ではじまる 12 文字の salt を使用する MD5 ハッシュ。
  • CRYPT_BLOWFISH - Blowfish ハッシュ。salt の形式は、 "$2a$" か "$2x$" あるいは "$2y$"、2 桁のコストパラメータ、"$"、そして文字 "./0-9A-Za-z" からなる 22 文字となります。 この範囲外の文字を salt に使うと、crypt() は長さゼロの文字列を返します。 2 桁のコストパラメータは反復回数の 2 を底とする対数で、 これは Blowfish ベースのハッシュアルゴリズムで使います。 この値は 04 から 31 までの範囲でなければならず、 それ以外の値の場合は crypt() は失敗します。 5.3.7 までのバージョンの PHP では、salt のプレフィックスとして "$2a$" だけしか使えませんでした。PHP 5.3.7 で新たなプレフィックスが導入され、 Blowfish の実装にあったセキュリティ上の弱点に対応しました。 セキュリティ修正の対応の詳細については » この文書 を参照ください。 簡単にまとめると、PHP 5.3.7 以降しか使わないのなら "$2a$" ではなく "$2y$" を使うべきだということです。
  • CRYPT_SHA256 - SHA-256 ハッシュに $5$ で始まる 16 文字の salt を組み合わせたもの。salt 文字列が 'rounds=<N>$' で始まる場合は、数値 N がハッシュループの実行回数を表します。 これは Blowfish のコストパラメータのようなものです。 rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定できます。 この範囲外の N を指定すると、近い方の境界値に切り詰められます。
  • CRYPT_SHA512 - SHA-512 ハッシュに $6$ で始まる 16 文字の salt を組み合わせたもの。salt 文字列が 'rounds=<N>$' で始まる場合は、数値 N がハッシュループの実行回数を表します。 これは Blowfish のコストパラメータのようなものです。 rounds のデフォルトは 5000 で、1000 から 999,999,999 までの値を指定できます。 この範囲外の N を指定すると、近い方の境界値に切り詰められます。

注意:

PHP 5.3.0 以降、PHP 自身にもそれぞれの実装が含まれるようになりました。 システム側でそのアルゴリズムがサポートされていない場合にこの実装を使用します。

パラメータ

str
ハッシュしたい文字列。
警告 CRYPT_BLOWFISH を使うと、 str が最大 72 文字までに切り詰められます。
salt
ハッシュのもととなる salt 文字列。省略した場合の挙動は アルゴリズムの実装によって決まるので、予期せぬ結果となることがあり得ます。

返値

ハッシュした文字列を返します。 失敗した場合は、salt とは異なることが保証されている 13 文字未満の文字列を返します。 警告 パスワードを検証するときの文字列比較関数は、 タイミング攻撃に対して脆弱ではないものでなければいけません。 これをもちいて、crypt() の出力と既知のハッシュとを比較します。 PHP 5.6 以降には、このために使える hash_equals() 関数が追加されました。

注意

注意: 復号するための関数はありません。 crypt() が使用しているのは単方向アルゴリズムだからです。
警告この関数は(まだ)バイナリデータ対応ではありません!

サンプル

例1 crypt() の例

$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 crypt() を htpasswd で使用する例

// パスワードを設定します $password = 'mypassword'; // ハッシュを取得します。salt は自動生成させます $hash = crypt($password);

例3 異なるハッシュ形式を用いた crypt() の例

/* これらの salt はあくまでも一例として示したものであり、実際のコードにそのまま使ってはいけません。    別の、適切な形式の salt を生成して各パスワードに使いましょう。 */ 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

参考

  • hash_equals() - タイミング攻撃に対して安全な文字列比較
  • password_hash() - パスワードハッシュを作る
  • md5() - 文字列のmd5ハッシュ値を計算する
  • mcrypt 拡張モジュール
  • 暗号化関数についての Unix man ページ
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール