質問: いつも回答ありがとうございます。 現在、セッションについて勉強しております。 私のローカル環境は、Windows10にWebMatrixを入れており、IIS8.0でPHP5.5.38です。 PHPでは、`session_start()`をコールすれば、自動的にセッションIDを発行してくれます。 例えばですが、下記の`e89r86p6dg04fumh0lanro3pn5`のように一意の値を割り当ててくれます。 ``` Set-Cookie: PHPSESSID=e89r86p6dg04fumh0lanro3pn5; path=/ ``` ここまでは、理解しております。 このセッションIDが安全なのか調べていたら、下記のサイトのようにデフォルトの「MD5」は安全ではないので、変更した方がよいとの記述がありました。 * PHPのセッションIDは暗号論的に弱い乱数生成器を使っており、セッションハイジャックの危険性がある > > セッションIDはMD5でなくSHA384にすべきです。 > > > * PHPのセッションIDのアルゴリズム設定について > > PHPを初期設定の状態で、セッションを使用すると、セッションIDは、「MD5」のアルゴリズムを使用して生成されます。 > > MD5は、「128bit」のハッシュ値を生成することが出来ますが、セキュリティ的には心もとないので、セッションを使用するのであれば、「PHP.ini」の設定を見なおす必要があります! > > > `php.ini`または`ini_set`で`session.hash_function`を設定することで、アルゴリズムの変更が可能かと存じます。 * PHP5.3.0未満なら`SHA1(160bit)`へ変更可 * PHP5.3.0以降なら`SHA256(256bit)`または`SHA512(512bit)`などへ変更可 私の環境でphpinfoを実行してsession.hash_functionの項目を確認したところ`0`と記載されておりますので、MD5(128bit)が使われているかと存じます。 ここでクエスチョンです。 **■クエスチョン1** 上述したサイトの指摘通り、デフォルトのセッションID(MD5)を使用するのは危険でしょうか? session.hash_functionの変更は、必須と考えた方がよろしいでしょうか? **■クエスチョン2** PHPマニュアルのsession.hash_functionには下記のようにPHP7.1.0で削除されたとの記載があります。 どのような理由で削除されたのでしょうか? > > 注意: > > この設定は PHP 5 で導入されました。また、PHP 7.1.0 で削除されました。 > > > ご存知の方いれば、教えてくださいm(__)m
回答: PHPにはさほど強くないので、 暗号化技術の方面に限ったお話となります。 ### 暗号化技術の2010年問題 暗号化技術には**2010年問題**というものがあり、 **NIST(アメリカ国立標準技術研究所)**によればSHA-1も2010年には米国の政府主要機関での利用を取りやめSHA-2への移行するようにとの勧告が出されました。 日本でも2013年までには、 政府主要機関でのSHA-1の利用からSHA-2への移行するというお話はありました。 (完全に遂行されてるのかまでは分かりませんが...) 以上からから言えることはSHA-1、それとその前身と言えるMD5は**セキュリティ的には万全な対策でない**ということには間違いありません。 参考までに個人的に暗号技術とその移行についてまとまってると感じたものを以下に掲載いたします。 (といってもセッション暗号化でなく暗号化通信の説明となりますが・・・ ) 暗号の世代交代-IPA MD5とSHA SSLの暗号アルゴリズム移行について ### MD5でなくSHA-2以上にすべきか? 上記のように話はしてますが、 セキュリティ強度の高い暗号アルゴリズムに変える必要があるかどうかは、 作成しようとしているWebサイトの特性次第でしょう。 * インターネットに公開する * セッションを奪われると致命的となるもの(通販、銀行口座への入出金) 上記のようなサイトを構築するのであれば**SHA-2以上の強度**の暗号化技術を利用するのが無難です。 そうでなければ、 MD5でも十分かなと個人的には思います。 (強度は低いよりは高い方が良いのは良いですがね) ### 蛇足 蛇足ですがセッションハイジャックの対策は何も暗号化技術だけではありません。 例えば重要な取引の前は、 再度ユーザ認証(ログイン)を実施ささるようにするなど・・・ (これはCSRF対策となりますが) セッションハイジャック(CSRF、セッション固定化攻撃)の原理や具体的な対策例などは少し旧い資料となりますがこちらが参考になります。