最終更新日:
公開日:
レシピ
文字列
文字列からハッシュ値を取得する
PHPの文字列からハッシュ値を取得する関数と、それぞれの違いを解説します。
この記事のポイント
- ハッシュ値を計算する関数はパスワード用か、それ以外かで使い分ける
- パスワードなどの機密性を持った文字列はpassword_hash関数を使う
代表的な4つのハッシュ関数
PHPは標準で文字列からハッシュ値を計算する関数がいくつか用意されています。
代表的なものは次の4つです。
関数名 | 説明 |
---|---|
hash | 指定したアルゴリズムでハッシュ値を生成する。PHP5.1.2以降で使用可能 |
md5 | MD5方式で、16進数・32文字のハッシュ値を生成する |
sha1 | SHA-1方式で、16進数・40文字のハッシュ値を生成する |
password_hash | パスワードなど機密性の高い文字列のハッシュ値を生成する関数。自動で「ソルト」を付与したり、計算コストの調整機能もある。PHP5.5以降で使用可能 |
1つの文字列「DogAndCat」を使って、それぞれの関数でハッシュ値を生成するコード例を紹介します。
コード例
// ハッシュ値を計算する前の文字列
$str = "DogAndCat";
// hash関数
var_dump( hash( "sha256", $str));
// md5関数
var_dump( md5($str));
// sha1関数
var_dump( sha1($str));
// password_hash関数
var_dump( password_hash($str, PASSWORD_DEFAULT));
出力例
// hash関数
string(64) "67d479a83ace7d62d29f41cdd13369a3d61e63560bd8ce42b95d0ab28b8d86dc"
// md5関数
string(32) "626f7fc3d0f67e2f6bfc4e9f1b5f14e5"
// sha1関数
string(40) "c43d2e4b728e2fd624fee1b7eb942a590c8f7b3e"
// password_hash関数
string(60) "$2y$10$e6sCK.CID7GRAgPdXW0heuQduEXw8vzmDNR2.hY1llpm/lOQi071y"
これらの関数の使い分け方として、パスワードの暗号化はpassword_hash関数、それ以外ではhash関数でアルゴリズム指定をして使うケースが多いです。
hash関数は次のように第1パラメータのアルゴリズム指定することで、MD5方式やSHA1方式のハッシュ値を計算することができます。
コード例
// ハッシュ値を計算する前の文字列
$str = "DogAndCat";
// MD5方式で暗号化
var_dump( hash( "md5", $str));
// SHA1方式で暗号化
var_dump( hash( "sha1", $str));
password_hash関数の基本的な使い方は次のようになります。
コード例
// ハッシュ値を計算する前の文字列
$str = "DogAndCat";
// ハッシュ値を計算
password_hash($str, PASSWORD_DEFAULT, array('cost'=>10));
1つ目のパラメータはハッシュ値を計算したいパスワードなどの文字列を渡します。
2つ目のパラメータはハッシュ値を計算するアルゴリズムの指定です。
ここに「PASSWORD_DEFAULT」を指定すると、現在標準となっているCRYPT_BLOWFISHアルゴリズムでハッシュ値を計算します。
その他にも「PASSWORD_ARGON2I」でArgon2アルゴリズムを使うこともできます。
使用できるアルゴリズムは今後もPHPのアップデートにあわせて新しくなっていく可能性が高いです。
3つ目のパラメータはハッシュ値計算の計算コスト(難易度)を指定しています。
初期設定では「8」ですが、この値が高いほど計算が難しくなりセキュリティ上も好ましいため、ご利用されるサーバーのスペックが許す範囲で高い値を設定することをお勧めします。