ハッシュ関数について/password_hash()を利用する

2016年2月8日

PHP

ハッシュ関数はログイン機能を実装する場合などに利用します。ユーザから入力されたパスワードをそのまま生データとしてデータベースに登録してしまうと、万が一データが漏洩した場合に、そのパスワードが悪用されてしまう恐れがあります。そこで、ハッシュ関数の非可逆処理の性質を利用します。

 

関連ページ(姉妹ブログ)

『Webセキュリティ教室』/セキュリティの境界を巡って

 

 

スポンサーリンク

 

 

入力したデータ(「メッセージ」と呼びます)をハッシュ関数に通して生成された値をハッシュ値と呼びます。そのハッシュ値から元のデータを復元することが難しいことから(下記のpassword_hash()の項目参照)、ユーザからの入力値をこのハッシュ値に変換してデータベースに登録していきます。

 

 

hash

 

 

また、あるドキュメントファイルのハッシュ値を比べることによって、そのファイルが本物であるかどうかを判定することもできます。ファイルが改ざんされたりなどして、少しでもファイルのデータが違うとハッシュ値も変わってくるからです。このようにしてデータの同一性を認識することを、正真性または完全性(Data integrity)と呼びます。

 

参照ページ(姉妹ブログ)

Bitcon2.0系サービス「Proof of Existence」の存在証明について調べてみたこと

 

 

 

ハッシュ関数の特徴


 

ハッシュ値は元のデータの大小に関わらず、一定の長さの文字列として出力されます。また、ハッシュ関数においてキーワードとなるのが、計算量とソルトです。

 

ソルトはデータをハッシュ化する際に付加される文字列です。たんに入力されたデータ(メッセージ)からハッシュ値を生成するよりも、ハッシュ値を生成する都度に、メッセージにソルトを付け加えていくと更に安全性が増していきます。

 

また計算量が多くなれば、ブルートフォース攻撃(総当たり攻撃)を防ぐことができます。つまり、計算コストが多くなるということです。

 

 

password_hash()関数


 

パスワードのハッシュ化は、ハッシュ関数であるpassword_hash()が推奨されています(PHP5.5以上)。

 

ちなみにsha1()やmad5()は、同じハッシュ値を持つメッセージを2つ作り出せる攻撃がすでに可能となっています。よって効率性を求めたハッシュ処理の際には利用されますが、パスワード処理に関しては推奨されていません。

 

 

このpassword_hash()関数において、ソルトの指定はPHP7以上において非推奨となっています。デフォルトのままでもソルトは自動で生成され、上記のコードをブラウザで表示させると画面をリロードするたびにハッシュ値が変化するのが分かります。

 

上記のコードではコストはデフォルトでは10に設定されていますが、以下のように第三引数にコストを指定することができます。

 

 

また現時点において、このpassword_hash()関数には、BCrypt(Blowfish暗号)と呼ばれるアルゴリズムが採用されています。つまり第二引数のPASSWORD_DEFAULTをPASSWORD_BCRYPTに変えてもこのBCryptによるハッシュ値が生成されます。もし将来、BCryptよりも最適なハッシュ化のためのアルゴリズムが見つかれば、PHPのバージョンアップと共にpassword_hash()関数のデフォルトに採用される可能性があるということです。

 

 

password_verify()


 

password_hash()関数によって生成されたハッシュ値を検証する時に利用するのが、password_verify()関数です。

 

 

 

参照ページ・文献


 

「PHPマニュアル」

password_hash
安全なパスワードハッシュ

 

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー