私は最近のパスワードのリーク(LinkedIn、eHarmony、Last.fm)に関するオンラインの議論を追ってきたが、salt値がパスワードを安全にするという強固な信念を持つ開発者が、まだ大勢いるようだ。

  攻撃者がsaltを有していたとしても、攻撃は実質上可能ではない。何故なら14文字の鍵空間をチェックするには非常に時間が掛かるためで、よってsaltにより安全が保たれる、というのが一般的な推論のようだ。小さい子供がテディベアを抱きしめるように、デベロッパはsaltを握りしめていれば、すべての悪しきクラッカーを寄せ付けずにいられると考えている、と言っても良い。

  残念なことに、人間は一般に、乱数ジェネレータでは無い。Francois Pesceによる非常に素晴らしい調査が、このことに関する動かぬ証拠を提供している。

  基本的にFrancoisが行っているのは、LinkedInのもののような、巨大なパスワードデータベースを辞書攻撃によって攻撃し、クラックしたパスワードを次の攻撃のために辞書に追加する、というものだ。これは、人々が特定のサービスで使用する傾向のあるパスワードに対して、攻撃を自動的に最適化する。そして彼は、レインボーテーブルを使用せずに実験を行っているが、これは彼の実験のセットアップが、パスワードはsaltされているが、攻撃者がsalt値を得ている状況もカバーすることを意味している。

  これは、人々が使いがちな典型的パスワードを探し、こうした一般的パスワードのさらなる置換を発見し、データベースで簡単に手に入れられるものを全て獲得するのに、非常に効果的な手法だ。

  攻撃者がユーザーアカウントの60パーセントから80パーセントを得られるなら、しっかりと選択されたパスワードがあるため、20パーセントから40パーセントのアカウントをクラッキングできなくても、誰が気にするだろうか?

  ではこうした手法に対してどのように防御すべきか?

  正規ユーザは単語を含むパスワードを選ぶべきではなく、長いパスフレーズの方がベターだが、それらはGPUが支援する辞書攻撃に驚くほど弱い可能性もある。

  大部分のユーザは決して強いパスワードを使用しないのだから、開発者はスロー・ハッシュ・インプリメンテーションに切り替え、ユーザごとに一意のsalt値を使用すべきだ。しかし開発者は、あまりに多くのユーザが同時に認証しようして、CPUサイクルを使い果たすのを恐れるため、スロー・ハッシュへの切り替えには驚くほど抵抗がある。

  多すぎる正規ユーザが同時にログインしようとする問題に対処するため、攻撃者たちのアイディアを盗むことができる。敵が行うのと同じように、GPUでユーザのパスワードハッシュチェックを計算すれば良い。

nvidia_cuda (134k image)

  たとえば、NVidiaのCUDAプラットフォームは、パスワード認証サーバに組み込むのに理想的だ。CUDAを使用すれば、敵と同じ土俵に立つことができる。パスワードサーバごとに一つのCUDA対応カードでも、パスワードハッシュチェックを1msで計算でき、敵もそのパスワードをクラックしようとするのに1ms必要となる。これは1秒に何億もの試みを行うのではなく、攻撃者は1秒に数千の試行に制限されることを意味している。

  もちろん、攻撃者は、例えば、100のCUDAもしくはパワフルなATIカードを入手できるが、それは非常に効果であり、そのような攻撃者に1秒に230,000,000,000回ではなく、たった100,000回の試行しか提供しない。

  残念なことに、Webもしくは他のアプリケーションに対するCUDAあるいはATI GPUサポートの統合情報を得るのは難しいが、そのためにオープンソースおよび開発者コミュニティがある。

  私はパスワード認証でCUDAを使用するためのオープンソースライブラリを見つけられなかったが、オープンソースクラッキングツールのいずれかを、容易に適用することができるだろう。たとえば:http://code.google.com/p/pyrit/ はWPA/WPA2-PSKを目的としているが、パスワードのチェックにも利用できる。

Post by — @jarnomn