見出し画像

安全かつ速い配送を実現する驚くべき仕組み:共通鍵×公開鍵のハイブリッド

はい、こんにちは!松井真也です。

シリーズ「毎日あなたが安全にウェブ利用できるスゴイ仕組み:SSL/TLS」の第4回でございます!

前回は、SSL/TLSのバージョンについてお話ししました。SSL/TLSのバージョンは脆弱性との戦いでした。POODLE攻撃やBEAST攻撃などの攻撃方法を乗り越えて、TLS1.2やTLS1.3が現在の主流となったのでしたね!

さて、今回は、SSL/TLSで使用する暗号方式がテーマです!とても考え抜かれた仕組みで、鍵の共有問題を乗り越えつつ、高速な暗号化通信を実現します。これに加えて、ハッシュ関数が「改ざん検知」と「サーバ認証」の2つで活躍します。

早速見ていきましょう!

処理が速いが共有に問題がある「共通鍵暗号方式」

まずは、暗号方式の方からいきますか。

SSL/TLSが使用する暗号化方式には、大きく分けて二つのタイプがあります。一つは共通鍵暗号方式で、もう一つは公開鍵暗号方式です。

共通鍵暗号方式(AESなど)は非常に高速であり、データの大量転送に適しています。しかし、鍵の共有を安全に行うのが難しいという問題があります。クライアントとサーバで共通して使用する鍵を作るのはいいけれど、それってどう安全に共有するの?って話になります。平文で送ってはいけませんね…。

共通鍵暗号方式の概要だけ触れますね。共通鍵暗号方式では、同一の鍵(共通鍵)を暗号化と復号の両方に使用します。

この方式の代表的なアルゴリズムにはAES(Advanced Encryption Standard)があります。AESはその効率の良さから広く使用されており、256ビットの鍵長を用いることが一般的です。

共通鍵暗号方式の最大の利点はその処理速度です。データの大量転送が必要な場合、公開鍵暗号方式に比べて遥かに高速に動作します。

しかし、この方式の課題は鍵の配布です。安全なチャネルを通じて鍵を共有する必要があり、この過程でセキュリティリスクがあるんです。

処理は遅いが鍵配送問題を解決「公開鍵暗号方式」

これに対して、公開鍵暗号方式(RSAなど)は、処理速度が遅いものの、鍵の配布問題を解決することができます。

公開鍵暗号方式では、暗号化と復号に異なる鍵を使用します。この方式では、公開鍵が公開され、誰でもアクセスできる状態で、秘密鍵は鍵の所有者だけが保持します。

SSL/TLSでは主にRSA(Rivest-Shamir-Adleman。ライベスト先生はいろんなところに登場しますな…)が使用されます。公開鍵はデータを暗号化するために用いられ、対応する秘密鍵でのみ復号できます。

公開鍵暗号方式の利点(の一つ)は、鍵の配布に関するセキュリティリスクを軽減できる点にあります。公開鍵を使用して共通鍵を暗号化して送信し、秘密鍵を使ってその共通鍵を復号します。これでカギ配布の問題はクリアできます。

このように、SSL/TLSはこれらを「いいとこどり」したハイブリッド方式を採用しているのです!

暗号化通信の大きな流れはこうだ

上記のように、通信の初期段階で公開鍵暗号方式を用いて共通鍵を安全に共有し、その後は高速な共通鍵暗号方式でデータのやり取りを行うことが分かりました。もう少し補足しますか。

ステップ 1: セッション鍵の生成

クライアントは通信セッションのための一時的な鍵、いわゆるセッション鍵(共通鍵)を生成します。この鍵がセッション中のすべての通信に使用されます。

ステップ 2: セッション鍵の暗号化

生成されたセッション鍵は、サーバの公開鍵を用いて暗号化されます。この公開鍵はサーバによって事前に提供されていることが前提です、念のため。例えばサーバのデジタル証明書を通じて、クライアントに配布されることが一般的です。

ステップ 3: 暗号化されたセッション鍵の送信

暗号化されたセッション鍵はインターネットを介してサーバに送信されます。この暗号化されたセッション鍵は、攻撃者が読み取らることは困難です。

ステップ 4: セッション鍵の復号

サーバは受け取った暗号化されたセッション鍵を自身の秘密鍵で復号します。この秘密鍵はサーバだけが保持しています。ふう、これでセッション鍵は安全に共有できました!

ステップ 5: セッション鍵を使用した通信の暗号化

復号されたセッション鍵は、その後の通信セッション中にサーバとクライアント間でのすべてのデータの暗号化と復号に使用されます。この段階からは共通鍵暗号方式が用いられるため、データの暗号化と復号は非常に高速に行われます。

はい、本日はここまで!今回はSSL/TLSで使用する暗号方式についてご紹介しました。共通鍵暗号方式と公開鍵暗号方式を上手に組み合わせるんですね!

すみません、ハッシュ関数について扱う時間がなかったので次回に回します!ではまた。

この記事が気に入ったらサポートをしてみませんか?