ハッシュ関数はログイン機能を実装する場合などに利用します。ユーザから入力されたパスワードをそのまま生データとしてデータベースに登録してしまうと、万が一データが漏洩した場合に、そのパスワードが悪用されてしまう恐れがあります。そこで、ハッシュ関数の非可逆処理の性質を利用します。
関連ページ(姉妹ブログ)
スポンサーリンク
入力したデータ(「メッセージ」と呼びます)をハッシュ関数に通して生成された値をハッシュ値と呼びます。そのハッシュ値から元のデータを復元することが難しいことから(※下記のpassword_hash()の項目参照)、ユーザからの入力値をこのハッシュ値に変換してデータベースに登録していきます。
また、あるドキュメントファイルのハッシュ値を比べることによって、そのファイルが本物であるかどうかを判定することもできます。ファイルが改ざんされたりなどして、少しでもファイルのデータが違うとハッシュ値も変わってくるからです。このようにしてデータの同一性を認識することを、正真性または完全性(Data integrity)と呼びます。
参照ページ(姉妹ブログ)
Bitcon2.0系サービス「Proof of Existence」の存在証明について調べてみたこと
ハッシュ関数の特徴
ハッシュ値は元のデータの大小に関わらず、一定の長さの文字列として出力されます。また、ハッシュ関数においてキーワードとなるのが、計算量とソルトです。
ソルトはデータをハッシュ化する際に付加される文字列です。たんに入力されたデータ(メッセージ)からハッシュ値を生成するよりも、ハッシュ値を生成する都度に、メッセージにソルトを付け加えていくと更に安全性が増していきます。
また計算量が多くなれば、ブルートフォース攻撃(総当たり攻撃)を防ぐことができます。つまり、計算コストが多くなるということです。
password_hash()関数
パスワードのハッシュ化は、ハッシュ関数であるpassword_hash()が推奨されています(PHP5.5以上)。
ちなみにsha1()やmad5()は、同じハッシュ値を持つメッセージを2つ作り出せる攻撃がすでに可能となっています。よって効率性を求めたハッシュ処理の際には利用されますが、パスワード処理に関しては推奨されていません。
1 2 3 4 |
<?php $message = "ウェブの葉"; $hash = password_hash($message, PASSWORD_DEFAULT); echo $hash; |
このpassword_hash()関数において、ソルトの指定はPHP7以上において非推奨となっています。デフォルトのままでもソルトは自動で生成され、上記のコードをブラウザで表示させると画面をリロードするたびにハッシュ値が変化するのが分かります。
上記のコードではコストはデフォルトでは10に設定されていますが、以下のように第三引数にコストを指定することができます。
1 2 3 4 5 6 7 |
<?php $options = [ 'cost' => 15, ]; $message = "ウェブの葉"; $hash = password_hash($message, PASSWORD_DEFAULT,$options); echo $hash; |
また現時点において、このpassword_hash()関数には、BCrypt(Blowfish暗号)と呼ばれるアルゴリズムが採用されています。つまり第二引数のPASSWORD_DEFAULTをPASSWORD_BCRYPTに変えてもこのBCryptによるハッシュ値が生成されます。もし将来、BCryptよりも最適なハッシュ化のためのアルゴリズムが見つかれば、PHPのバージョンアップと共にpassword_hash()関数のデフォルトに採用される可能性があるということです。
password_verify()
password_hash()関数によって生成されたハッシュ値を検証する時に利用するのが、password_verify()関数です。
1 2 3 4 5 6 7 8 9 |
<?php $message = "ウェブの葉"; $hash = password_hash($message, PASSWORD_DEFAULT); if (password_verify("ウェブの葉", $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } |
参照ページ
「PHPマニュアル」