暗号

暗号とは

暗号は、悪意のある第三者、つまり攻撃者がいる所でもセキュアな通信を提供します。暗号では、アルゴリズムと鍵を使用して、入力(プレーンテキスト)を暗号化された出力(暗号文)に変換します。同じ鍵が使用されると、特定のアルゴリズムは常に同じプレーンテキストを同じ暗号文に変換します。

暗号文が与えられた場合に、攻撃者がプレーンテキストまたは鍵のプロパティを特定できなければ、アルゴリズムはセキュアであると見なされます。鍵を使用したプレーンテキスト/暗号文の組み合わせが多数あると考えると、攻撃者は鍵について何も特定できないはずです。

対称暗号と非対称暗号の違い

対称暗号では、暗号化と復号化の両方に同じ鍵が使用されます。送信者と受信者は、両方に認識されている共有鍵を既に持っている必要があります。鍵の配布は難しい問題であり、非対称暗号を開発するきっかけとなりました。 

非対称暗号では、暗号化と復号化に2つの異なる鍵が使用されます。非対称暗号システムのすべてのユーザーは、公開鍵と秘密鍵の両方を持っています。秘密鍵は常に機密性が保持されますが、公開鍵は自由に配布できます。

公開鍵で暗号化されたデータは、対応する秘密鍵を使用した場合のみ復号化できます。たとえば、Johnにメッセージを送信するには、そのメッセージをJohnの公開鍵で暗号化する必要があります。Johnのみが秘密鍵を持っているので、Johnだけがメッセージを復号化できます。秘密鍵で暗号化されたデータは、対応する公開鍵を使用した場合のみ復号化できます。同様に、たとえばJaneは、自分の秘密鍵を使用してメッセージにデジタル署名することができ、Janeの公開鍵を持っている人は誰でも署名済みメッセージを復号化して、実際にJaneがメッセージを送信したことを確認できます。

対称は一般的に非常に高速で、大量のデータ(ディスク・パーティション全体またはデータベースなど)の暗号化に最適です。非対称は処理がはるかに遅く、鍵長(通常は2048ビット以下)よりも小さいデータのみを暗号化できます。そのため、非対称暗号は一般的に、はるかに大きなデータ・ブロックの暗号化に使用される対称暗号化鍵を暗号化するために使用されます。デジタル署名の場合、非対称暗号は一般的に、メッセージ全体ではなくメッセージのハッシュを暗号化するために使用されます。

暗号システムは、鍵の生成、交換、保存、使用、取消、および交換を含む暗号鍵の管理機能を提供します。

ソフトウェアの設計と導入の弱点を特定して対処しましょう。

詳細はこちら

暗号で解決できる問題

セキュア・システムは、データの機密性、整合性、可用性と、信頼性や否認防止など、いくつかの保証を提供する必要があります。正しく使用すれば、暗号はこれらの保証を提供するのに役立ちます。暗号により、移動中のデータと保存データの両方の機密性と整合性を確保できます。また、送信者と受信者を相互に認証して、否認から保護することもできます。

ソフトウェア・システムには、多くの場合、複数のエンドポイント(通常は複数のクライアント)と1つ以上のバックエンド・サーバーがあります。これらのクライアント/サーバーの通信は、信頼できないネットワークを介して行われます。通信は、インターネットなどのオープンな公共ネットワーク、または外部の攻撃者や悪意のある内部関係者によって侵害される可能性のあるプライベート・ネットワークを介して行われます。

また、信頼できないネットワークを通過する通信を保護できます。攻撃者がネットワーク上で実行を試みる可能性のある攻撃には、主に2つのタイプがあります。受動的攻撃では、攻撃者は単にネットワーク・セグメントをリッスンし、機密情報が通過する際にその情報を読み取ろうとします。受動的攻撃は、オンライン(攻撃者がトラフィックをリアルタイムで読み取る)またはオフライン(攻撃者がトラフィックをリアルタイムでキャプチャし、後でそれを閲覧する(おそらく、ある程度の時間をかけて復号化した後))の場合があります。能動攻撃には、攻撃者がクライアントまたはサーバーになりすます、転送中の通信を傍受する、コンテンツを目的の宛先に渡す(または完全にドロップする)前にコンテンツを閲覧および/または変更する場合が含まれます。

SSL/TLSなどの暗号プロトコルによって提供される機密性と整合性の保護により、悪意のある傍受や改ざんから通信を保護できます。信頼性保護は、意図したとおりにユーザーが実際にシステムと通信しているという保証を提供します。たとえば、オンライン・バンキングのパスワードを自分の銀行または他の誰かに送信していますか?

保存データの保護にも使用できます。リムーバブル・ディスクまたはデータベース内のデータを暗号化して、物理メディアの紛失または盗難が発生した場合に機密データの開示を防止することができます。また、保存データの整合性保護を提供して、悪意のある改ざんを検出することもできます。 

原則

留意すべき最も重要な原則は、決して自分独自の暗号システムを設計しようとしないことです。世界屈指の優秀な暗号学者(Phil ZimmermanやRon Rivestなど)でも、深刻なセキュリティの欠陥がある暗号システムを日常的に作成しています。暗号システムが「セキュア」であると見なされるには、暗号システムは、セキュリティ・コミュニティによる厳しい監視を受けなければなりません。隠蔽によるセキュリティ、または攻撃者がシステムの知識を持っていない可能性があるという事実は決して信用しないでください。悪意のある内部関係者および強い意志を持った攻撃者がシステムへの攻撃を試みるということを忘れないでください。

セキュアな暗号システムに関して言えば、「秘密」にする必要があるのは鍵そのものだけです。システムが使用する鍵を保護するには、適切な手順を実行してください。暗号鍵を、保護するデータと一緒にクリア・テキストで決して保存しないでください。これは、玄関のドアをロックして、玄関マットの下に鍵を置くようなことです。攻撃者が最初に探す場所です。鍵を保護するための3つの一般的な方法(最も安全性が低いものから最も安全性が高いものまで)を以下に示します。

  1. 鍵をファイル・システムに保存し、強力なアクセス制御リスト(ACL)で保護します。最小権限の原則に従うことを忘れないでください。
  2. データ暗号化鍵(DEK)を2番目の鍵暗号化鍵(KEK)で暗号化します。KEKは、パスワード・ベース暗号化(PBE)を使用して生成する必要があります。最小限の管理者のみが知っているパスワードは、bcrypt、scrypt、PBKDF2などのアルゴリズムを使用した鍵の生成、および暗号システムのブートストラップに使用できます。これにより、暗号化されていない鍵をどこかに保存する必要性がなくなります。
  3. ハードウェア・セキュリティ・モジュール(HSM)は、鍵を安全に保存するために使用できる改ざん防止ハードウェア・アプライアンスです。コードは、HSMに対してAPI呼び出しを行って、必要に応じて鍵を提供したり、HSM自体でデータの復号化を実行したりできます。

業界のベストプラクティスに準拠したアルゴリズム、鍵の強度、および運用モードのみを使用するようにしてください。Advanced Encryption Standard(AES)(128、192、または256ビットの鍵を使用)は、対称暗号化の標準です。非対称暗号化の標準は、少なくとも2048ビットの鍵を使用するRSAと楕円曲線暗号(ECC)です。Electronic Codebook(ECB)モードのAESやパディングのないRSAなど、セキュアでない運用モードは避けてください。