【レインボー攻撃】とは?攻撃手口や対策をわかりやすく解説!
- パスワードを生年月日を組み合わせて作っていませんか?たとえハッシュ化(パスワードを自分で作る)されていてもレインボー攻撃を受けるとあなたのパスワードが簡単に解読されますよ!
- 「ハッシュ化」とは万が一不正アクセスされても解読されないよう、元のデータとは全く異なる値に置き換えること。「レインボー攻撃」とはレインボーテーブルを使ってハッシュ化されたデータを解読する「パスワードクラック手法」の1つです。
一般的にパスワードやアクセスキーなどの重要なデータはハッシュ化して保存されるのですが、レインボー攻撃はハッシュ化した値さえも解読できるのです。
ここでは「レインボー攻撃」の仕組みや被害事例、攻撃を防ぐための対策について詳しく解説します。
「ハッシュ」「還元関数」などの専門用語をわかりやすく説明していますので、ぜひ最後までご覧ください。
レインボー攻撃とは?
レインボー攻撃(Rainbow Attack)とはレインボーテーブルを使ってハッシュ化されたデータを解読する攻撃です。
アカウントを乗っ取る目的でパスワード解読に使われる「パスワードクラック(データを解析して他人のパスワードを割り出すこと)」の1つとして知られます。
- “ハッシュ化されたデータ”が狙われるのですね。誰がターゲットになるのですか?
- レインボー攻撃のターゲットはサーバーに格納されたデータベースです。データベースにはWEBサイトやアプリの認証に使うユーザー情報が含まれます。
利用するWEBサイトやアプリのデータベースがターゲットになったら、あなたの情報も解読される恐れがあります。
WEBサイトに登録するときは
- 1.IDやパスワードなどユーザーの情報をサイト側と共有。
- 2.登録後にログインする際は、初めに登録したユーザー情報を入力して本人か判断
します。
ユーザーの情報は認証の度に必要となるためサーバーのデータベースに格納されますが、情報をそのまま保存すると万が一不正アクセスされたときに悪用されます。
そこでデータベースに格納するデータを解読しにくくするために「ハッシュ化」するのです。
ハッシュ化とは?
サイト運営者:「ハッシュ化」は暗号化とは少し異なります。まずは「ハッシュ化」について詳しく解説します。
「ハッシュ化」とは「ハッシュ関数」と呼ばれるアルゴリズム(一定のルールに基づいた計算)によって、元に戻せない「ハッシュ値」へと置き換えること。
「password」の平文(元の文)を、ハッシュ関数【MD5】を用いてハッシュ値に置き換えます。
- ハッシュ化すると元のデータが全くわからなくなります。「ハッシュ化」はパスワードやアクセスキーなどのデータが解読されるのを防ぐのが目的です。
- 暗号化とは何が違うのでしょうか?
- 「暗号化」と「ハッシュ化」の違いは「データを元に戻せるか・戻せないか」です。暗号化された情報は「鍵」を使って復号化(復元)できますが、ハッシュ化した情報は作業した人も含めて元の入力値に復元できません。
2-1.ハッシュ値はレインボー攻撃で解読される
「ハッシュ化」は安全性の高い方法ですが万能ではありません。
なぜならハッシュ関数が変わらない限り、同一テキストに対するハッシュ値は同じだからです。
先ほどお伝えした
は、「MD5」と呼ばれるハッシュ関数でハッシュ化したものです。
このような平文とハッシュ値はペアになっており、ハッシュ関数を変更しない限り変わることはありません。
- 置き換えられる値さえ知っていれば何かわかるのですね!でもパスワードは単語や数字・記号を組み合わせれば心配ないのでは?
- わかりにくくしたはずのパスワードやデータも解読されるのが「レインボー攻撃」です。
単語や数字・記号を組み合わせて作られたデータのハッシュ値を推測するのは困難です。
しかし「レインボーテーブル」と呼ばれる「ハッシュ値から元の値を割り出すための対応表」を使うと割り出せます。
レインボーテーブルを使った攻撃の仕組み
「レインボーテーブル」は「平文とハッシュ値の組み合わせを知っていれば還元可能」な性質を利用したものです。
「レインボーテーブル」には平文とハッシュ値の組み合わせが記録され、ハッシュ値を照らし合わせれば簡単に平文を導き出せます。
では、ここからレインボーテーブルとレインボー攻撃の仕組みをみていきます。
ハッシュ関数と還元関数で「チェイン化」する
まず「レインボーテーブル」の仕組みについて解説します。
たとえば64種の文字や数字の組み合わせで、8文字のパスワードをつくるとしましょう。
この組み合わせ総数は281兆もの膨大な量になるうえ、ハッシュ値に変換した場合はビット数が増えて数千万テラバイトもの保存領域が必要となります。
つまり、考えられる全ての組み合わせデータは一般的なPCに保存できません。
この問題を解決するため、レインボーテーブル「還元関数」を使います。
還元関数
ハッシュ値を元に平文を得る関数。ただしハッシュ値を計算して元の平文に戻せるものではなく、ハッシュ値から元の平文とは別の平文へと変換するもの。
レインボーテーブルでは「ハッシュ関数」と「還元関数」を使い、大量の平文とハッシュ値のペアを「チェイン化」して生成します。
チェイン化は次のように行います。
- 1.ハッシュ関数で元データの平文をハッシュ値にする。
- 2.そのハッシュ値を還元関数で平文に戻す。
- 3.その平文をハッシュ関数でハッシュ値にする。
※チェインを生成する際は「ハッシュ関数は都度同じもの」「還元関数は順番によって異なるもの」を使います。
これを繰り返し、最終的には「はじめの平文」と最後に還元関数で生成した「おわりの平文」のみを保存。
「はじめ」と「おわり」の平文以外のすべてを削除するので、記憶域を節約できます。
仮に100回・500回繰り返し行っても「はじめ」と「おわり」の平文以外は必要ありません。
何回行ってもはじめの平文が同じである限り、同じ手順を踏めば平文とハッシュ値の組み合わせを求められるからです。
レインボーテーブルを使えば、途方もないパスワードの組み合わせを圧縮して通常のPCでも処理できます。
レインボーテーブルで平文へと還元する方法
次にレインボーテーブルを使って、どのようにハッシュ値から元のデータへと解読するかみていきます。
- 1.「手に入れたハッシュ値」をチェイン化の最後に使った還元関数で平文に戻す
- 2.テーブルに記録した「おわりの平文」と比較し、一致するか調べる。
- 3.一致した場合はそのチェインの中にハッシュの元となった平文が含まれることになるため、チェインを復元
- 4.おわりのハッシュ値に対応する平文が目的の平文となる
「おわりの平文」と一致しなかった場合は入手したハッシュ値を還元関数で平文にし、ハッシュ関数でハッシュ値にします。
そうして求めたハッシュ値をチェイン末尾のハッシュ値と比較し、一致するかを調べます。
チェイン末尾のハッシュ値と一致しなかった場合は同じように「チェイン最後から1つ前のハッシュ値と比較」を繰り返し、一致したらチェインを復元して目的の平文を見つけます。
レインボー攻撃なら10文字パスワードも数分で解読可能
- レインボーテーブルを作るのも、それを使って復元するのも複雑で面倒ですよね?そこまでの手間をかけて攻撃する意味があるのでしょうか?
- 確かに復元は作成よりも手間がかかるため「誰がこんな面倒な攻撃を?」と思うでしょう。実はレインボー攻撃を可能とするソフトウェアやデータベースが出回っているのです。ソフトウェアを使えばハッシュ関数をGPUで並列解析し、10文字程度のパスワードならものの数分で解析できます。
レインボーテーブルを使って無差別攻撃すれば、相応数のデータを得られます。
レインボー攻撃は「効率的」な攻撃方法
パスワードクラックの1つとしてよく知られる「ブルートフォース攻撃」は、レインボーテーブルのようなデータを必要としません。
ただし解析時の総当たりに時間がかかる分、不正アクセスが検知されれば攻撃が成功する確率は低くなります。
レインボー攻撃はレインボーテーブルとそれを保存・解析できるだけのストレージさえあれば、成功確率が高くなります。
高速解読するものも出回っているため、それほど時間はかかりません。
とても効率的な攻撃方法なのです。
レインボー攻撃【実際に起きた被害事例】
レインボー攻撃により「ハッシュ化していれば安全」の常識は覆されました。
事実レインボー攻撃によって次のような被害が起きています。
ハッシュ化されたパスワード20万件を悪用
アメリカをはじめ世界各国で利用されるビジネス特化型SNS「LinkedIn」の被害事例です。
2012年に「LinkedIn」からおよそ1憶1,700万人分のパスワードが流出。
これらのパスワードは「ハッシュ化」されていましたがレインボー攻撃によって割り出され、およそ650万件以上がハッカーフォーラム(サイバー犯罪の闇市場)に投稿されました。
パスワードはハッシュ関数SHA-1で「ハッシュ化」されていましたが、強度を高める「ソルト」は行われていませんでした。
数百年かかるはずのハッシュ値を解読
2015年、出会い系サイト「Ashley Madison」から40ヶ国3,300万人以上の会員のパスワードが流出しました。
このサイトでは「解読に数百年かかる」といわれるアルゴリズム「bcrypt」を使って「ハッシュ化」しましたが、解読されたのです。
原因はユーザーパスワードを通常ログインと自動ログインの両方に使用していたためでした。
自動ログインでは推奨されていないハッシュ関数MD5でハッシュ化し保存していたため、レインボー攻撃によって元のパスワードが簡単に割り出されたのです。
- パスワードの長さが5~8文字で2種類の文字しか組み合わせできないなど、「パスワード要件」が甘かったのも要因と言えます。
レインボー攻撃に有効な3つの対策
現在多くのアプリケーションやOSでは、パスワードやアクセスキーに対して「ハッシュ値」を個別に生成し保存する仕組みになっています。
しかしレインボーテーブルが出回り解析に時間がかからないなら、ハッシュ値から生成し保存するのは「盗まれるリスクを減らす」「盗まれるまでの時間稼ぎ」でしかありません。
レインボー攻撃からパスワードやデータを守るにはどうしたらよいのでしょうか?
最後にレインボー攻撃でデータを解読されるのを防ぐ対策についてご紹介します。
解読されにくいパスワードにする
ユーザーはパスワードを設定する際、解読されにくいパスワードにするよう心掛けましょう。
- 文字や数字・記号を組み合わせる
- わかりやすい言葉や単語は使わない
- 文字列はランダムにする
- 文字列は長めにする
英数字を組み合わせて複雑にし、できる限り文字列を長くすると解読されにくくなります。
- 「複数のサイトで同じパスワードを使用しない」「定期的なパスワードの変更」も重要です。
「ソルト」でレインボーテーブルを無効化
「ハッシュ化」された値は「ソルト」で強度を高められます。
「ソルト」とはランダムに生成された文字列です。
ソルトを結合させると全く異なるハッシュ値になり、平文を前提に事前準備されたレインボーテーブルを無力化できます。
ただしすべてのパスワードに同じソルトを使うと、ソルトを解読できた場合にすべてのパスワードが読み取られます。
パスワード毎に異なるソルトの設定が大切です。
「ストレッチング」で高速解読対策
「ストレッチング」とはハッシュ値への変換を数千~数万回繰り返し行うことです。
ストレッチングを行うと元データをより推測しにくくなるため、解析までの時間稼ぎができます。
これはグラフィックボードなどを利用した高速解読にも有効な方法です。
ただしストレッチングはサーバーの負荷が増える点に注意。
まとめ
ここまで「レインボー攻撃」の仕組みや被害事例、攻撃を防ぐための対策について解説しました。
万が一情報漏洩しても解読されないために行う「ハッシュ化」。
不可逆的な値へと変更するため、鍵管理が必要な暗号化よりも安全性が高いといわれていました。
しかしハッシュ値は「レインボー攻撃」によって簡単に解読されます。
「レインボーテーブル」のソフトやデータベースが出回っており、攻撃者は効率よくデータを盗み出そうと常にその機会をうかがっています。
レインボー攻撃を受けてデータ解読されるのを防ぐため、「パスワード難読化」「ソルト」「ストレッチング」「セキュリティ強化」による対策を行いましょう。
最も重要なのは「不正アクセスを許さない」ことです。
ネットワーク上の至る所に存在するセキュリティホールに対処し、不正アクセスをブロック・検知する強固なセキュリティ製品の導入をおすすめします。
会社の情報を守ることはクライアントや顧客からの信頼を得ること。
この機会にセキュリティの対策範囲を見直し、強化しましょう。