Cloudflareは、SSL暗号化で使用する100のラバランプの写真をランダムデータに変換します。
この記事を読み終えると、以下のことができるようになります。
記事のリンクをコピーする
安全な暗号化にするうえでランダム性は非常に重要です。データを暗号化するのにコンピューターが使用するそれぞれの新しい鍵は、攻撃者が鍵を見つけてデータを復号化できないように真にランダムなものでなければなりません。しかし、コンピューターは、任意のインプットに基づいて、予測可能で論理的なアウトプットを提供するように設計されています。予測不可能な暗号鍵を生成するのに必要なランダムデータを生成するようには設計されていません。
強力な暗号化に必要な予測不可能で無秩序なデータを生成するには、コンピューターはランダムデータのソースが必要です。物理世界における事象は予測不可能であるため、実は「実世界」はランダム性の素晴らしい源なのです。
ご推察のとおり、ラバランプは常にランダムです。ラバランプの「ラバ(溶岩)」は同じ形になることは決してないため、ラバランプのグループはランダムデータの素晴らしい源です。
このデータを収集するため、CloudflareはCloudflare本社のロビーの壁に100のラバランプを配置して、ランプに向けてカメラを設置しました。カメラは等間隔でランプの写真を撮り、画像をCloudflareサーバーに送信します。すべてのデジタル画像はコンピューターによって一連の数値として実際に保存され、各ピクセルには数値が付けられます。そうすることで、各画像はCloudflareサーバーが安全な暗号鍵を生成するための開始点として使用できる完全にランダムな数字列になります。
このように、Lava Lampの助けを借りて、Cloudflareは極めて強力(かつ十分にランダムな)SSL/TLS暗号化をお客様に提供することができます。数百万ものインターネットプロパティがCloudflareを使用していることを考えると、このことは特に重要です。
暗号技術において、ランダムとは単に統計的に無作為であるという意味だけではなく、予測不可能であるという意味もあります。
予測可能なデータは推測できるため、暗号化されたデータは完全なランダムデータのように見えるべきです。何らかのパターンがある場合、特定の値がほかのものよりも多く暗号化に使用されている場合、または値が常に一定の順序で現れる場合、数学的分析によりパターンが特定され、攻撃者は暗号化に使用される鍵をずっと簡単に推測できてしまいます。本質的に、暗号化されたデータが予測可能であるならば、とっくに侵害されている可能性があります。
暗号化のプロセス自体は予測可能なものです。暗号化されたデータに正しい鍵を使えばデータを復号化できます。復号化されたデータは暗号化される前のものと同じです。しかし、使用される暗号鍵は予測不可能でなければなりません。
予測不可能性が極めて重要な理由を理解するために、2人のポーカープレイヤーを想像してみてください。ボブは、常に良い手札のときに賭けて、悪い手札のときにフォールド(勝負を降りること)します。一方、アリスは、はっきりとしたパターンにならないように、賭け方を変えます。良い手札のときに賭けることもあれば、フォールドすることもあります。また、悪い手札のときにはったりをかけて賭けることもあります。アリスとボブが同じポーカー大会に参加します。ボブはあまりに予測可能であるため、アリスの方がボブよりも長く勝ち残ります。対戦相手はボブが良い手札を持っているのを素早く見抜いて手を打ちます。ボブの手札を見ることはできませんが、どのような手札なのか大まかに予想することはできます。
同様に、攻撃者は「手札」つまりネットワークを介して送信される暗号化されたコンテンツを見ることはできなくても、コンテンツを隠す方法があまりに予測可能であれば推測できてしまいます。
コンピューターはロジックに基づいて動作します。コンピュータープログラムは、if-thenステートメントに基づいています。一定の条件を満たすと、その指定されたアクションを実行します。プログラムへの同じインプットが毎回同じアウトプットを生み出します。
これは設計によるものです。インプットは予想されるアウトプットを導き出すべきです。プリンターが送信された文書上のテキストのデータとは異なるテキストを無作為に印刷したり、スマートフォンがユーザーの入力した電話番号とは違う番号にかけたりしたら、大変なことになることを想像してみてください。コンピューターが有用なのは、その(相対的な)信頼性と予測可能性のためです。しかし、その予測可能性は、安全な暗号鍵の生成に関してはデメリットになります。
一部のコンピュータープログラムは、ランダム性のシミュレーションが得意ですが、暗号鍵の生成についてはそこまで得意ではありません。
擬似乱数発生器(PRNG)と呼ばれるソフトウェアプログラムは、予測不可能なインプットを使用して予測不可能なアウトプットを生成できます。理論的には、PRNGはランダムなインプットから無限のランダムなアウトプットを生成できます。
そうしたアルゴリズムのことを「ランダム」ではなく「擬似ランダム」と呼ぶのは、アウトプットが実際には完全にランダムではないからです。なぜでしょうか?次の2つの主な理由があります:
2番目の理由より、このアルゴリズムは継続して新しいランダムなインプットを必要とします。このランダムなインプットを「シード(SEED)」と呼んでいます。
暗号学的に安全擬似乱数発生器(CSPRNG)とは、より厳格な基準を満たしたPRNGであり、暗号化の使用により安全とされるものです。CSPRNGは、PRNGが必ずしも満たすとは限らない2つの要件を満たしています:
PRNGと同様に、CSPRNGはよりランダムなデータを生成する起点としてランダムなデータ(シード)を必要とします。
SSL/TLS暗号化のための暗号鍵を生成するために、Cloudflareは、CSPRNGのデータとシードの一部としてラバランプから収集したデータを使用します。
シードとは、ランダムなデータを生成するための起点としてCSPRNGが使用するデータのことです。CSPRNGは理論的には1つのシードから無限のランダムなアウトプットを生成できますが、シードを定期的に更新する方がはるかに安全です。攻撃者は最終的に初期のシードを侵害できる可能性があります。前述のようにCSPRNGに同じシードを与えるとまったく同じ結果を返しますので、攻撃者はランダムなアウトプットを複製することができてしまいます。また、最も厳格なテストに合格したCSPRNGであっても、無限に予測不可能な結果を生み出すという保証はありません。
ラバランプを使用することで、Cloudflareは、新しいシードを継続的に生み出すソースを確保することができます。カメラが撮るラバランプの画像はそれぞれ異なるため、シードとして使用できる異なるランダムな数値の列が生成されます。
多くのオペレーティングシステムは、たとえばユーザーのアクション(マウスの動き、キーボードの入力など)のように、シードに使用するランダムなデータの独自のソースを持っていますが、こうしたデータを比較的ゆっくりと取得します。Cloudflareは、SSL/TLS暗号化のためのシードを生成するときのエントロピーを最大化するために、ラバランプから取得したランダムなデータと2つの異なるマシン上のLinuxオペレーティングシステムによって生成されるデータを組み合わせます。
一般に、「エントロピー」は無秩序または混乱を意味します。ただし、暗号学ではエントロピーは特別な意味を持ちます。予測不可能性を意味します。暗号学者は、任意のデータセットがどの程度のエントロピーを持っているかをビット数にて測定します。そのため、Cloudflareでは、ラバランプの壁のことを「エントロピーの壁」と呼んでいます。
ラバランプの壁はCloudflare本社の混雑したロビーにあるため、こうした状況は常に発生します。ロビーに出入りする人々は、ランプの横を通り過ぎたりランプの前で立ち止まって話をしたりします。実際には、そうした人々によるラバランプの撮影の妨害はランダム性の一部となり、エントロピーを生み出すのに役立っています。
そうした事態が発生した場合でも、Cloudflareには、Cloudflareサーバー上で実行しているLinuxオペレーティングシステムからのランダム性の2つのソースがあります。また、カメラはCloudflareが所有する場所にありカメラに簡単にアクセスすることができるので、すぐ電源をオンにしたり、必要であれば交換したりすることができます。
Cloudflareの2つのメインオフィスはロンドンとシンガポールにあり、それぞれが実世界のインプットからランダムなデータを生成する独自の方法を持っています。ロンドンオフィスでは、オフィスに取り付けられた二重振り子(振り子の先にもうひとつの振り子を連結したもので、その動きは数学的に予測不可能だとされている)のシステムの写真を撮ります。シンガポールオフィスでは、ウランのペレット放射性崩壊(無害である少量)を測定します。
意外なことに、そうではないのです。Silicon Graphicsという会社が1996年に「Lavarand」と呼ばれる同様のシステムを設計していますが、特許は失効しました。
Cloudflareのラバランプの壁の詳細については、 こちらの2つのブログ投稿をご覧ください: