SSLってどんな技術でできてるの?<br>~ハッシュとデジタル署名編~

SSLってどんな技術でできてるの?
~ハッシュとデジタル署名編~

2017.04.12

今回のコラムでは、一方向ハッシュ関数と、デジタル署名についてご紹介します。 どちらも以前コラムで取り上げたSSLサーバ証明書で使用されている仕組みです。ネットワークを介して送るデータの改ざん検知やなりすましを防止することができ、これらは通常組み合わせて利用します。

まずは、一方向ハッシュ関数について紹介をしていきます。

一方向ハッシュ関数

一方向ハッシュ関数 とは、二つのデータが完全に同一のデータであることを証明 するために利用します。この完全に同一であるとは、文字の色や太さも含め、すべてが同一であることを指します。

そもそも、なぜこのような仕組みが存在するのでしょうか。

例えばデータを二者間でやり取りする場合、送信前のデータと、受信後のデータが本当に同じものなのか、確認しなければならない場合があります。ネットワークを介してデータのやり取りをしている間に第三者がデータの中身をいじったり、別のデータに入れ替えていないかをチェックしなければいけない場合などです。

本当に正しいデータ?

一方向ハッシュ関数を使用しなくても、文書ファイルなのであれば、一文字一文字比較し、チェックしていけばいいように思えます。しかし、送信前のデータを持っていなかったら比較することはできないですし(自分宛てにファイルを送った場合は別ですが…)、そもそも非常にファイルサイズが大きかったら、比較するだけでも何時間もかかってしまいます。また、送信したファイルがもし画像ファイルや動画ファイルだったら、一つのフレームの1ピクセルごとに比較していかなければいけないでしょう。つまり比較は可能かもしれませんが、そのメリットが労力に見合いません。

一方向ハッシュ関数の考え方は、このようなファイル全体をスキャンしてチェックするのではなく、一方向ハッシュ関数によって生成された、ハッシュ値 と呼ばれる小さなデータを比較して、互いのデータが同一なのか比較 することです。これによって得られた同一であるという性質を、正真性 と呼びます。

一方向ハッシュ関数の仕組み

では、ここから一方向ハッシュ関数の仕組みを解説していきます。

一方向ハッシュ関数は、メッセージ と呼ばれる 入力データ (つまり文書とか画像データですね)から ハッシュ値を生成 し、出力します。ハッシュ値の長さはその一方向ハッシュ関数の種類にもよりますが、常に短い固定サイズの値です。

つまり簡単なテキストファイルでも、映画などの非常にサイズの大きな動画ファイルでも 同じ長さのハッシュ値 が得られます。逆に入力データであるメッセージの大きさによって値の長さが異なってしまうと、サイズの大きなファイルほど、正真性のチェックに時間がかかってしまいますね。つまり、一方向ハッシュ関数を使用することで、どのようなサイズのファイルでも、同じ時間で正真性のチェックができるということです。

また、一方向ハッシュ関数の性質として、メッセージを少しでも変えると、得られるハッシュ値は全く異なる値 になります。これも重要な性質で、変えた箇所が小さいとき、得られるハッシュ値の変化が小さかったら、その違いに気が付かないかもしれません。データが改ざん されても、気づかない性質は非常に危険だといえるでしょう。

そのため、一方向ハッシュ関数では、少しの変化が、全く異なる結果を導出するよう設計されています。

デジタル署名

次に、デジタル署名 についてご紹介します。

デジタル署名とは、データの改ざんやなりますましが行われていないかを確認するための技術 です。現実の署名作業(荷物を受け取った時のサイン)をコンピュータの世界に持ち込んだものです。

現実の署名とほとんど同じです

デジタル署名が必要な状況としては、何か署名(サイン)を行う必要がある場合を考えてみましょう。例えば、契約に関する内容をメールで送る場合 などが考えられますね。しかし、契約内容をメールで送ったとしても、それはだれも信用してくれません。メールは簡単に偽造できるからですね。

デジタル署名では、公開鍵と秘密鍵のペアを使用 します。

通常、公開鍵 は、暗号化 を行うために利用し、ペアで生成した 秘密鍵 によって 復号化 を行なっていました(詳細は 過去のコラムをご覧ください)。
デジタル署名では、公開鍵と秘密鍵を逆の順番で利用 します。秘密鍵でデジタル署名をし、公開鍵でデジタル署名の検証と呼ばれる作業をします。

デジタル署名は、秘密鍵の所有者が送るデータが、秘密鍵の所有者自身で用意した文書であると認める 行為のことです。先の例だと、この契約書は、契約者本人が用意した書類であることを認めます、という証です。

デジタル署名の検証作業とは、デジタル署名を行ったのは、秘密鍵の所有者自身であると確かめるための作業のことです。

先ほど紹介しましたが、このデジタル署名とデジタル署名の検証作業は、公開鍵と秘密鍵のペアで行われます。
秘密鍵は、キーペアを生成した本人だけが所有 し、公開鍵は要求すれば誰でも入手 することができます。
そのため、デジタル署名をすることができるのはキーペアを生成した本人だけ であり、デジタル署名の検証を行うことができるのは、公開鍵を持つ全員となります。

技術的には、通常復号化をするはずの秘密鍵で暗号化を施し、暗号化をするはずの公開鍵で復号化をすることがデジタル署名とその検証作業となります。以前のコラム でも記載しましたが、公開鍵と秘密鍵は密接に関係のある数で、そのため、鍵を逆に利用してもきちんと暗号化と復号化の処理ができるのです。

一方向ハッシュ関数とデジタル署名を組み合わせる

最後に、一方向ハッシュ関数と、デジタル署名が どのように組み合わされ、利用されているのか を紹介します。これによって、送信者が送ったデータが、受信者に内容が変更されずに送ることができていると理解することができます。

  1. 送信者は、事前に キーペアを作成 しておきます。
  2. 送信者は、一方向ハッシュ関数を利用してメッセージの ハッシュ値を計算 します。
  3. 送信者は、求めたハッシュ値に対して、秘密鍵で暗号化 します(デジタル署名)。
  4. 送信者は、元のメッセージとデジタル署名(ハッシュを暗号化したもの)を一緒に 受信者に送信 します。
  5. 受信者は、送信者が送ってきたデジタル署名を、事前に入手しておいた 送信者の公開鍵で復号化 します(検証します)。
    復号化されたハッシュ値を得ることができます。
  6. 受信者は、送信者が送ってきた元のメッセージの ハッシュ値を計算 して求めます。
  7. 検証したハッシュ値と、元のメッセージから求めた ハッシュ値を比較し一致しているかを確認 します。
  8. 一致すれば、送信者から送られたメッセージが送信の途中で変化していないこと(書き換えられたりすり替えられたりしていないこと)を確認することができます。

さいごに

いかがだったでしょうか。一方向ハッシュ関数の仕組みとデジタル署名について解説してきました。今まで紹介してきた公開鍵と秘密鍵が意外な方法で使用されていることが併せて確認できたと思います。

今後もまた暗号化で使用されている仕組みを紹介していきます。次回もお楽しみに!!

記事は、予告なく変更または削除される場合があります。
記載された情報は、執筆・公開された時点のものであり、予告なく変更されている場合があります。
また、社名、製品名、サービス名などは、各社の商標または登録商標の場合があります。