質問: phpでパスワードをハッシュ化して安全にDBに格納したいと考えいてるのですが、ベストな方法が見つかりません。 phpのマニュアルの下記URLのアドバイスを見ると、crypt関数でBlowfishアルゴリズムでハッシュを作るのがベストな選択肢のようなのですが、 それをどうやって実装していいのかがわからずに困っています。 マニュアルのcryptページのサンプルには crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') このように例が記載されているのですが、saltは任意の文字列だと思われるのですが07?にあたる部分の「コストパラメーター」?を得る方法が分からずに困っております。 ちなみにPEARのCrypt_Blowfishというものを見つけたのですが、ググるとこれはどうも可逆暗号のようでパスワード文字列のように復号できると安全度が下がるようなものには使うべきではないのかと考えておりますが、あっておりますでしょうか。 質問を重ねて申し訳ありませんが、詳しい方にアドバイスをお願いできればと思います。 よろしくお願いいたします。
回答: 幾つでもいいといえばいいのでは? マニュアルをそのまま解釈すれば、04なら16回、08なら256回、31なら......21億回くらいハッシュ化を繰り返す、ということだと思います。 なので、数字を大きくすればするほど計算時間がかかってしまいます。 そしてそれが狙いです。なので、大きくできるなら大きくしておいた方が良いと思います。 多分(暗号理論は難解で以外な所に落とし穴あったりするので一応) 万が一、暗号化したファイルが流出した場合、ブルートフォースアタックで復号されてしまう危険性がありますが、ハッシュ化に時間がかかればかかるほど、探し当てる時間を長くできます。 例えば07の時、3日で探し当てるマシンがあったとします。すると08なら6日、10なら1ヶ月近く、14なら1年以上、20なら67年と、実質復号不能に持っていけます(ただし、将来的に計算アルゴリズムの改良による高速化とかハードの高速化を考慮しなければ)。 ただ、辞書攻撃などで陥落しない、本当に総当たりのブルートフォースアタックの場合という大前提がありますが。 これの7番かな? 可逆暗号の場合、暗号化キーをどう扱うかという問題が発生します。 暗号化したデータと一緒に保存しては意味がありませんが、プログラムからはアクセス可能でなければなりません。 また、一旦復号出来た時は全てのパスワードが復号できる事になります。 ただ、例えばワンタイムパスワードを使用しようと思うと、一方向ハッシュは使えないのです。 なのでサーバに保存されたデータの流出を心配するか、ユーザの入力後の盗聴を心配するか、と言う話になると思います。 ただし、フィッシングとかソーシャルハック的攻撃に乗らないという前提での話になりますが。