少し前に、Logjam脆弱性が話題となりましたが、「ついでに」(という言い方も変かもしれませんが)DHEにまつわる他の問題も掘り出されてしまった感があり、ちょっとややこしいので整理しておきましょう。
まず、DHEとは
DHEとは、盗聴の危険がある通信経路で安全に暗号鍵を共有するための方式です。RSA暗号と同様に1、離散対数の困難性(ある数gをx乗して、それを別な数pで割った余りは簡単に計算できるけど、gとpと余りがわかってもxは簡単に計算できない)ことを元にしています。
- 通信相手(アリスとボブ)の間で、$g$と$p$を共有します。
- アリスとボブそれぞれがランダムに値($a$と$b$とします)を選びます。
- それぞれが $g^a \bmod p=A$、$g^b \bmod p=B$ を求めて、相手に知らせます。
- アリスとボブは、それぞれ相手からもらった値を自分の値だけ累乗して、余りを取ります。$B^a \bmod p = A^b \bmod p$ なので、二人は同じ値を共有できます。
- 通信路に流れた$g$、$p$、$A$、$B$の4つの値から二人が共有した値を計算する簡単な方法はありません。
3つの問題点
Logjamもあって話題となっているDHEの3つの問題点は、以下のような感じです。
- 輸出暗号を受け付けるサーバー・クライアントでは、512ビットまでDHEの強度が落とされてしまう(これがLogjam)
- 1024ビットなど、DHEの強度が不十分なサーバが多い
- 多くのサーバが、共通の素数を使っている
Logjam
その昔、アメリカ合衆国は軍事上の理由から、暗号技術に輸出規制をかけていて、許可なしに扱えるのが共通鍵暗号で40ビット、RSAやDHEでは512ビットが上限となっていました。そのため、SSLの規格内でも512ビットのDHE鍵交換を行うような系が組まれました。
21世紀に至って規制は緩和されたのですが、当時の輸出用暗号を使えるままの設定になっていたサーバが多数存在しました。そして、現代の技術にかかれば、512ビットのDHEはクラウドを借りれば100ドルも払わずに、半日程度で解読できる程度の強度しかなくなってしまっていました。うまく512ビットで鍵交換させるようにダウングレード攻撃をしかければ、解読できてしまうというわけです。
DHEの強度
Apache 2.2では、DHEの強度は1024ビットで固定となっています。DHEは原理的にRSAと共通ですが、現代のRSAでは最低でも2048ビットの暗号が使われ、1024ビットでは強度が不十分ということになっています。同じ鍵をずっと使うRSAと、その場で乱数を作るDHEで条件は違いますが、もはや1024ビットでは、国家機関にかかれば解読可能と見込まれています。
共通の素数
昔は設定のたびに素数を生成するのが負荷だったこともあって、サーバソフトウェアで固定の素数を使うような実装となっていることがあります。この1つの素数について攻略できれば、多くのサーバの暗号化を無力化できることになってしまいます。
対策
まずは本来のLogjamですが、輸出用暗号を無効にしましょう。いまやそんなものしか使えないクライアントはほぼ皆無(仮にあったとしても、高度化したWebに対応はまずできない)ですから、デメリットは無視できます。
2番目3番目については、設定を変えておきましょう。Apacheであれば2.4以降だと、DHパラメーターファイルを指定可能ですので、独自の素数を2048ビット以上で生成して指定しましょう。
なお、楕円曲線を使ったECDHEというものがあって、こちらでは256ビット〜521ビットと短いパラメーター長で同等の暗号強度となり、計算はずっと速い方式です。Android 2系列やWindows XPといった古い環境以外ではIEでも対応しているので、ECDHEが使える環境ならDHEを止めてしまうのも1つの選択肢かもしれません。
-
というより、DHのほうがRSAより先に考案されている ↩