Security)について簡単に紹介しました。今回はパスワードを安全に保存するツールの紹介です。今まで数回に渡ってMOPSの成果の一部を紹介してきましたが,今回で最後です。passwordshttp://www.php-security.org/2010/05/26/mops-submission-10-how-to-manage-a-php-applications-users-and-passwords/index.htmlこの論文は1位を取得した論文です。7でこのライブラリが利用されていたので筆者はphassの存在を知っていました。phpassは本格的なパスワードハッシュツールで,すべての開発者お薦めできます。ライセンスはパブリックドメインです。Peslyak氏が投稿した論文はライセンス条件が異なるので,今までのMOPSの紹介記事と異なり,論文を参考文献として筆者が書いた記事になります。パスワード保存の問題パスワードは言うまでもなく非常に高いセキュリティが要求される機密情報です。これはユーザ数が少ないサイトであっても同じです。多くのユーザは,ユーザが利用する複数またはすべてのサイトで共通のパスワードを利用しています。ユーザIDが同じであることも非常に多いです。このため,ユーザ数が少ないサイトであってもパスワードが漏洩してしまうと,パスワードが漏洩したユーザが利用するほかのサイトで盗まれたパスワードが利用され被害にあう可能性があります。パスワード漏洩は情報を盗まれたサイトだけの問題ではありません。保存されたパスワードの強度は次のようになります。saltとstretchingについては後述します。平文+stretching+saltのハッシュPeslyak氏によると「SSLを使っていないのに何故パスワードを暗号化する必要があるのか?」「⁠SSLを使っているのにパスワードを暗号化する必要があるのか?」と聞かれることがあるとしています。暗号化したパスワードを保存することと,ネットワークトランスポート層で暗号化することは別のリスクに対応する対策であるため無関係であり,パスワードのハッシュ化はパスワードが盗まれたり,漏れたりした場合の対策である,としています。すべてのセキュリティ専門家は同じ考えだと思います。パスワードは元のパスワードが解析できないような形で保存されるべきです。phpassはこれを実現するライブラリです。平文パスワードを平文で保存する問題点は指摘するまでもありません。SQLインジェクションなどでユーザデータが盗まれた場合,攻撃者はパスワードを解析する必要もなく利用できます。平文の場合,あまりにも簡単にパスワードが分かってしまうためユーザ情報にアクセスできる組織内部のスタッフにより悪用される可能性も高くなります。パスワードのハッシュ値を保存する方法は平文に比べて何倍もよいと言えるのですが,十分なセキュリティは提供しません。ハッシュ化したパスワードは総当り攻撃で解析したり,辞書を構築して攻撃できます。レインボーテーブルと呼ばれる特殊な辞書を構築すれば辞書サイズを大幅に小さくできます。8文字程度のパスワードをmd5ハッシュ化した状態は平文とあまり変わりがありません。sha1/sha256などより強度が強いハッシュ関数を利用することも可能ですが,十分に安全だとは言えません。平文+saltのハッシュsaltとはパスワードハッシュを辞書攻撃から守るためのランダム文字列です。固定saltは簡単に利用でき,saltを別に保存しておけば,一緒に盗めなかった場合はパスワードとsalt,両方を推測する必要があります。辞書を用意しておくことができないので,ハッシュするだけよりも高い安全性を期待できます。ユーザ別saltには色々な方法が考えられますが,ランダムな文字列をsaltとして生成してパスワードハッシュ文字列と一緒に保存する方法が利用されることが多いと思います。saltを利用することにより安全性はかなり向上しますが,ハッシュ関数は元々高速に動作するように実装されているのでsaltとパスワード文字列を使うだけでは総当たり攻撃でパスワードが解析される危険性は十分にあります。パスワードの強化ハッシュ関数は高速に動作するよう設計されています。この特徴はパスワードハッシュが盗まれた場合に解析されてしまうリスクを増加させてしまいます。strengheningと呼ばれています。CPUパワーが必要となるハッシュを利用したり,ハッシュを何度も適用してより多くのCPU時間を消費させる方法があります。saltのみを利用してパスワードを保存するよりかなり高い安全性を期待できます。ハッシュ関数の選択Peslyak氏はどのハッシュ関数を使用するかは,saltとstretchingを実装した,より高いレベルのパスワードハッシングの問題であるので,どのハッシュ関数を使うか問題ではないとしています。MD5の三種類のハッシュ関数が利用できるようになっています。MD5の順ですが,十分にstrechingを行えばMD5を利用してもBlowfishと同等の強度を達成できます。パスワードハッシングフレームワークphpassの解説の前に,PHPがサポートするハッシュ関数について説明が必要です。PHPにはmd5関数とcrypt関数があります。crypt関数はCRYPT_BLOWFISHとCRYPT_EXT_DESをサポートしています。5.3までのcrypt関数はシステムのcrypt関数を呼び出していたため,システムによってサポートするハッシュ関数が異なっていました。md5関数はPHPによって実装されています。3でも動作するそうです。phpassは特に指定しない限り,CRYPT_BLOWFISH,CRYPT_EXT_DES,md5の順番に利用可能なハッシュ関数を検索します。プラットフォームが異なるマシンにアプリケーションを移動する可能性があるシステムの場合は注意が必要です。phpassはランダムにsalt文字列を生成し,利用したハッシュ関数,Stretchingの回数(ハッシュの適用回数)を“⁠ハッシュでエンコードした文字列⁠”にして返します。phpassの準備phpassのホームページhttp://www.openwall.com/phpass/からtar.gzまたはzip形式のアーカイブをダウンロードし解凍します。demo6/phpass-articleというディレクトリに中にあるPasswordHash.phpファイルがphpassライブラリです。5でも問題なく動作します。phpassの使い方phpassの使い方は非常に簡単です。test.phpを見れば使い方は十分わかるはずです。'')\n";(省略)PasswordHashクラスのコンストラクタは以下のように定義されています。Stretching値$portable_hashes:論理値$iteration_count_log2は4以上,31までの値を設定します。この値がStretchingの値になります。$portable_hashesがtrueの場合,ハッシュ関数にmd5が利用されます。md5の順に試されます。HashPassword($password)平文の$passwordをハッシュします。$stored_hash)平文の$passwordと既に保存済みの$stored_hashとを比較します。1の場合同じ,0の場合異なるtest.phpのテスト用パスワードは埋め込まれているので同じパスワードですが,test.phpを繰り返し実行しても毎回違うパスワードハッシュが生成されます。PASSEDまとめPeslyak氏の論文には安全にデータベースへパスワードを保存するためにどのようにSQLインジェクションを防ぐか解説されていますが,SQLインジェクションについては本連載で既に取り扱っているので省略しました。phpassは小さいライブラリですが強固なパスワードハッシュを簡単に生成してくれます。既存のプロジェクトに採用するためには,移行期間は新旧両方のパスワードチェックを行うなど,多少の工夫で導入可能です。新規プロジェクトでは積極的に採用すべきよいライブラリです。phpassは優れたパスワードハッシュライブラリですが,ユーザが設定するパスワードが‘⁠123456⁠’のように脆弱なパスワードでは効果が半減します。ユーザが推測しやすいパスワードを利用しないようにしなければなりません。phpassにはこの目的を果たすpwqcheckコマンド用のラッパー,pwqcheck.phpがdemoディレクトリに保存されています。これまで数回に渡ってMOPS関連の記事を連載しましたが今回で最後です。Security)もPHPコミュニティにとって非常に有用なプロジェクトとなりました。数年後にMOPSが開催されるのを楽しみ待つことにします。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。URL:http://blog.ohgaki.net/著書Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?Amazon楽天ブックスhontoヨドバシ.com[改訂版]PHPポケットリファレンスAmazon楽天ブックスhontoヨドバシ.comこの記事に関連する書籍Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...はじめてのPHP言語プログラミング入門Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。