はじめに
こんにちは。Tsukasaです!
皆さん、データ暗号化はご存知でしょうか?
ITパスポートや基本情報技術者試験を受けたことのある方なら勉強をしたことがあるかもしれません。
私も軽く勉強をしたことがありますが、よくわかっていません。
以前HTTP/HTTPS、SSL証明書について記事にしたので、今回は暗号化(共通鍵、公開鍵、秘密鍵)について記事にしていこうと思います。
SSL証明書
SSL証明書とは、インターネット上で「通信の暗号化」と「Webサイトの運営者の身元証明」を行うための電子証明書です。これを導入することで、ユーザーとサーバー間のデータが暗号化され、悪意ある第三者からの盗聴やデータの改ざん、なりすましを防ぐことができます。
共通鍵、公開鍵、秘密鍵はこのSSL証明書を発行する時に用いられる暗号化となります。
それぞれの役割
共通鍵
データを暗号化するときと、暗号化されたデータを元に戻す(復号する)ときに同一の鍵を使う方式のことです。送信者と受信者が同じ鍵(共通鍵)を共有しているため「共有鍵」や「対称鍵」とも呼ばれます。
公開鍵
インターネット上でデータを安全にやり取りする「公開鍵暗号方式」で使われる暗号キーの一つです。誰にでもオープンにできる鍵で、主に「データの暗号化」と「電子署名の検証」に使われます。
秘密鍵
データの暗号化や復号、本人確認(電子署名)を行う際に用いられる、本人だけが厳重に管理すべき固有のデータ(パスワードのようなもの)です。第三者に知られると、なりすましやデータ盗難などの重大なセキュリティリスクに直結します。
実際の動き
まずはSSL証明書で通信を暗号化させます。
それによってサイトにアクセスするとHTTPSという表示になります。
よくある勘違いですが、これはサイトが暗号化されているわけではありません。
あくまでもデバイス(スマホやパソコン)からサイトにアクセスする際の通信が暗号化されているのです。
その際に共通鍵、公開鍵、秘密鍵が用いられているのです。
こちらはQiitaのURLです。
Qiitaだけではなく今では多くのサイトがHTTPSで通信が保護されています。
ユーザーはサイトにアクセスすると通信が保護されていますが、この場合のSSL証明書はQiitaのサイトを作ったエンジニアが発行したものになります。
ユーザーが直接何かをするということはありません。
そもそもデータ暗号化って何だよ
共通鍵、公開鍵、秘密鍵っていうからには何かを鍵で保護しているというのは何となくわかると思います。それでは実際に何を保護されているのでしょうか?
例えば、ECサイトにアクセスをしたとします。
そのECサイトを使うにはユーザーID、パスワードが必要です。そして決済をするためにクレジットカードの情報も登録をしていると思います。
鍵によって保護されているのはこのような情報です。
もし通信が保護されていなかったら、ハッカーがこのような情報を盗むことができ、情報が流出してしまう恐れがあります。そのために通信を暗号化する必要があるのです。
IDやパスワードがないサイトは何で保護されているのか?
世の中にあるウェブサイトの多くはHTTPSで保護されています。
ですが、ECサイトのようにIDやパスワードがあるものが鍵によって保護されていることは理解できますが、中にはログイン等をしなくてもアクセスできるウェブサイトもあります。
例えば皆さんもWikipediaを使ったりしますよね?
Wikipediaにアクセスする際にIDやパスワードを入力しなくてもアクセスができます。
ですが、Wikipediaも通信がHTTPSで保護されています。
この場合保護されているのは、「このページを見せて」というリクエストだけです。
特定のIDやパスワードといった個人情報は保護されません。
通信を行うということは、ユーザーが「このサイトを見たい」というリクエストをするだけでなく、その結果をユーザーに返す必要があります。
HTTPSではユーザーのリクエストに対しての結果も保護しています。
IDやパスワードがないのであれば、別に保護する必要がないので?という疑問も湧きますが、必要です。もし暗号化しないと、「あなたが今、何のページを見ているか」をハッカーにバレてしまいます。
もし通信が暗号化されていないと、ハッカーは「あ、この人はいま、特定の病気についてのページを熱心に読んでいるな」とか「この政治思想のページを見ているな」という、あなたの行動履歴やプライバシー(のぞき見)をすべて盗み取ることができてしまいます。
そのため、仮にIDやパスワードのないサイトだったとしても通信の保護は必要になってくるのです。
それぞれの鍵の違い
ここまでの説明で鍵が何を保護しているのか?何のために暗号化が必要なのか?というところがわかったかと思います。
ここからはそれぞれの鍵の役割と違いを見ていきたいと思います。
結論、共通鍵、公開鍵、秘密鍵はどれも使います。
おさらいとして、それぞれの役割を再度確認したいと思います。
共通鍵
「ロックする番号」と「解除する番号」が同じ合言葉です。
公開鍵と秘密鍵
「ロックする番号」と「解除する番号」が違うペアの鍵です。
公開鍵でロックして、秘密鍵で解除します。
先程、鍵で保護しているのはユーザーの情報やリクエストとお話ししましたが、これは共通鍵で保護しています。それでは公開鍵で保護しているものは何でしょうか?
公開鍵で保護しているのは共通鍵です。
ユーザーの情報やリクエストが入った箱を共通鍵で保護して、それを別の箱に入れて、公開鍵でロックして、秘密鍵で開けるというイメージになります。
マトリョーシカのようなもので考えるとわかりやすいかもしれません。
下記のようなイメージで考えていただけたらと思います。
+--------------------------------------------------------------------------+
| |
| |
| 1段目の箱(公開鍵モード):合言葉を渡すためだけの「空の箱」 |
| |
| +--------------------------------------------------------------------+ |
| | 【1段目の箱】公開鍵暗号の保護ゾーン (工事用) | |
| | ロック: 誰でもできる「サーバーの公開鍵」 | |
| | 解除: サーバーの「秘密鍵」だけで開く | |
| | | |
| | +--------------------------------------------------------------+ | |
| | | 【箱の中身】生成された「共通鍵 (合言葉)」 | | |
| | +--------------------------------------------------------------+ | |
| +--------------------------------------------------------------------+ |
| |
+--------------------------------------------------------------------------+
|
| サーバーが秘密鍵で解除して「共通鍵」を手に入れる
| 暗号化モードがカチッと切り替わる
V
+--------------------------------------------------------------------------+
| |
| |
| 2段目の箱(共通鍵モード):本物のデータを高速に運ぶ「秘密のトンネル」 |
| |
| +--------------------------------------------------------------------+ |
| | 【2段目の箱】共通鍵暗号の保護ゾーン (本番用) | |
| | ロック&解除: お互いに共有した「共通鍵 (合言葉)」で開閉 | |
| | | |
| | +--------------------------------------------------------------+ | |
| | | 【箱の中身】本物のデータ | | |
| | | ・ユーザーのID / パスワード | | |
| | | ・Webサイトの文字・画像データ | | |
| | +--------------------------------------------------------------+ | |
| +--------------------------------------------------------------------+ |
| |
+--------------------------------------------------------------------------+
SSL証明書で保護されている通信はユーザーがアクセスすると上記のような動きになります。
それではユーザーがURLにアクセスしてからの流れをまとめてみたいと思います。
挨拶(最初の0.1秒):【公開鍵モード】
ブラウザ: サーバーにアクセスする。
サーバー: 「いらっしゃい!これを使ってね」と、証明書に入った「公開鍵(南京錠)」をブラウザに渡す。
ブラウザ: その場で使い捨ての「共通鍵(同じ番号の合言葉)」を自動生成し、もらった南京錠でパチンとロックしてサーバーに送り返す。
サーバー: 厳重に隠し持っていた「秘密鍵(本物の鍵)」でガチャリと開け、中の「共通鍵」をゲットする。
暗号化と復号化の番号が「違う」仕組みのおかげで、インターネットの途中でハッカーに中身(共通鍵)を盗まれる心配が絶対にありません。
表示 & その後:【共通鍵モード】へスイッチ
お互いに「共通鍵(同じ番号)」が共有できたら、サーバーは同じ場所のまま、プログラムを「共通鍵モード」へカチッと切り替えます。
サーバーは、最初のページのデータをその「共通鍵」で爆速で暗号化してブラウザに送ります。画面にサイトが表示され、鍵マークがつきます。
その後の別アクセス(2ページ目を見る、ボタンを押すなど)も、最初に決めた「共通鍵(同じ番号)」をそのまま使い回して、爆速で通信し続けます。
暗号化の「箱」に入れられて守られているデータ
一度共通鍵のモードに入ると、ブラウザとサーバーの間に「外からは見えない不透明なトンネル」が通ります。
ユーザーが入力するデータも、サーバーから返ってくるデータも、すべて自動的に「共通鍵でロックされた箱」に入れられてインターネットの道路を走ります。
ユーザーのID、ログインパスワード
クレジットカード番号、決済情報
問い合わせフォームに入力した氏名、住所、電話番号
サーバーから返ってくる画面の文字、画像、マイページの個人情報
途中でハッカー(泥棒)がこの箱を盗み見ても、共通鍵のロックがかかっているため、ただの意味不明な文字列(ゴミデータ)にしか見えません。
実際のAWSではどうなっている?
AWSのサーバー(ALBなど)の中には、賢いプログラムが1つ入っています。このプログラムが、あなたからのアクセスに対して以下のように「1人で2つのモード」を使い分けています。
最初の0.1秒: サーバーのプログラムが「公開鍵・秘密鍵モード」で起動し、あなたから「共通鍵(合言葉)」を受け取ります。
それ以降: 合言葉を受け取った同じプログラムが、そのまま「共通鍵モード」にカチッとスイッチを切り替えて、あなたの個人情報(IDやパスワード)を読み込み始める。
まとめ
SSL/TLS(HTTPS)の本質:サイトそのものではなく、ブラウザとサーバー間の「通信経路」を暗号化して盗聴や改ざんを防ぐ技術。
暗号化の2段構え:最初の0.1秒は「公開鍵・秘密鍵」で使い捨ての「共通鍵」を安全に渡し、それ以降は「共通鍵」で本番データ(ID・パスワードや画面情報)を爆速で通信する。
保護される対象:個人情報だけでなく、ID/PWのないサイトでの「ページ閲覧リクエスト」や「返ってくる画面データ」も含めて全通信を不透明なトンネルで保護している。
最後まで読んでいただきありがとうございました!



