電子メールのセキュリティ(3) ~ デジタル署名とは ~

号通信が本当に安全なのかどうかについては、前項で学習した計8つの疑問を解消することによって証明することができます。逆にそれができなければ本当に安全な通信とは言えません。一体どのように証明するのでしょうか?

方法としては、ひとつの簡単な方法があるわけではなく、いくつかの方法を組み合わせて検証します。

まずは代表的な方法を学習していきましょう。

もっともメジャーな証明方法が、

デジタル署名(または電子署名)

という方法です。

文字どおり、インターネット上で自分自身を証明する「署名(サイン)」のことです。

実際の書類や契約書では、本人の筆跡で署名したり捺印することでその書類や契約書が「本人のもの」であることを証明します。それと同じで、電子メールに自分の筆跡でサインしたり捺印するイメージです。電子メールに「デジタル署名」を付けて送信することで、本人であることを証明し「なりすまし」を防ぐことができます。

※厳密には「電子署名」とは紙上の署名行為をデジタルに置き換えた技術の総称を指す用語で、デジタル署名も電子署名の技術のひとつになりますが、ここでは同義語として解説します。

デジタル署名の仕組み自体は少々難解ですが、イメージは単純です。

なぜなら、

公開鍵暗号方式の通常の通信の流れを逆にしたもの

だからです。

どういうことかというと、

自分の秘密鍵で暗号化して相手に送信する

ということです。

前項と同様に「あなた」と「花子さん」が通信を行う場合を例にして、考えてみましょう。

通常、公開鍵暗号方式の通信は、花子さんの「公開鍵」で暗号化して花子さんに送信するというものでした。デジタル署名は、逆にあなたの「秘密鍵」で暗号化して送信します。

デジタル署名の流れイメージ

片方の鍵で暗号化したものは対のペアとなる鍵でしか復号化できないというのが公開鍵暗号方式の原則でした。「秘密鍵」で暗号化して送信してしまうとどうなるでしょうか?

公開している「公開鍵」で誰にでも復号化することが可能になる

ということになってしまいます。

しかし、この方法により証明できることがあります。

秘密鍵で送信してきたということは本人に間違いない

ということです。

なぜなら、秘密鍵は本人しか持ち得ないので、公開鍵で正しく復号化できれば本人に間違いないということになるからです。つまり、他人が手に入れることのできない秘密鍵で暗号化することは本人以外不可能なため「なりすまし」が行われていないことになります。

流れにそって説明すると、デジタル署名の仕組みは公開鍵暗号方式の流れを逆にしたもので、「あなた」の秘密鍵で暗号化して「花子さん」に送信します。

この場合の暗号文は、公開されている「あなた」の公開鍵で誰にでも復号化できてしまう暗号文です。「花子さん」はこの暗号文を受け取って「あなた」の公開鍵で復号化します。これが正しく復号化できれば、その暗号文は「あなた」本人が送信したもので間違いないという証明になります。

なぜなら「あなた」の秘密鍵は「あなた」しか持っておらず、「あなた」の秘密鍵で暗号化されたものは、その対になっている「あなた」の公開鍵でしか復号化できないからです。

つまり、秘密鍵を第三者が手に入れることは不可能なため、「あなた」の秘密鍵で暗号化できるのは「あなた」だけになります。したがって、第三者による「なりすまし」は行われていないということになります。

このことによって「花子さん」側からすると、送信相手が「あなた」であることが証明され、また正しく復号化できたのであれば、「あなた」の公開鍵が「あなた」のもので間違いないということも証明されたことになります。

そしてさらに「あなた」は、送信の事実を「否認」できなくなります。

なぜなら、「あなた」の公開鍵で正しく復号化できたということは、送信者は秘密鍵を持っている「あなた」に間違いない、すなわち送信者は「あなた」しかいないという証明がなされたことになるからです。

このようにデジタル署名には、

送信者が本人である証明、公開鍵が本人のものである証明、否認防止

という3つの認証機能があります。

さて、とはいうものの公開鍵で誰にでも復号化できるのであれば、暗号化通信を行う意味がないようにも思われます。この暗号文の内容は誰に見られても良いものでなければならないからです。

また、一体どこが「署名」なのでしょうか?通常の公開鍵暗号方式の流れを逆にしただけです。

その理由は、デジタル署名の場合、本文を暗号化して送信するわけではなく、本文とは別の暗号文を作成しているからです。この別の暗号文がデジタル署名になります。

つまり、デジタル署名は、あくまで送信者の素性を証明することが目的であり、機密情報を送信するわけではありません。多くの場合、本文はそのまま平文で送り、その本文とは別の暗号文であるデジタル署名を添付します。(平文とデジタル署名を合わせて暗号化して送る場合もあります)

デジタル署名による証明の後に相手から本当の暗号文を送ってもらう

というのが一連の流れになります。

多くの場合は、デジタル署名と一緒に公開鍵を付けて相手に送信し、本人確認のあと、その公開鍵で暗号文を送ってもらいます。

では何を暗号化するのかというと、

メッセージダイジェスト(またはハッシュ値)

と呼ばれるデータを暗号化します。

メッセージダイジェスト(ハッシュ値)とは、

本文より「ハッシュ関数」という一方向関数を用いて抽出したビットデータ

のことを言います。

少し表現が難しいですが、ハッシュ関数という関数を用いると、本文から一定の長さのビット列が抽出されます。

コンピュータからするとメール本文も0と1のビット列に変わりありません。文章が長くなるとビット列も長くなるだけのことです。このビット列全体をハッシュ関数に当てはまめると、一定の長さの異なるビット列に変換することができます。

一定の長さというのは、ハッシュ関数のアルゴリズム(ハッシュ関数には複数のアルゴリズムがあります)によって異なりますが、128ビットや256ビットといった決まった長さのビット列(ビット長)に変換されるということです。

これは、短い文章でも長い文章でもデータのビット列の長さ(データ量)に関わらず、一定の長さのビット列が生成されます。例えば「あ」という一文字からでも128ビットのビット列が生成されます。(ビット列であれば良いためテキストだけでなく他のファイル形式でも変換することができます)

ハッシュ関数のイメージ

図のとおり、コンピュータの処理的には2進数のビット列ですが、ハッシュ値は「0~F」の16進数で表されます。(2進数と16進数については、その他の基礎知識編 2進数と10進数と16進数 を参照してください)

16進数は4ビットで1文字を表現する(0~1111=0~F)ので、例えば、128ビットを生成するハッシュ関数で32文字、256ビットを生成するハッシュ関数で64文字の16進数となります。

こうして生成された一定の長さの16進数(ビット列)を「メッセージダイジェスト」または「ハッシュ値」と言います。他にも「フィンガープリント(指紋)」などと呼ばれる場合もあります。

そもそも、なぜハッシュ関数を用いてメッセージダイジェスト(ハッシュ値)を作成するのかということですが、ハッシュ関数とメッセージダイジェストには次のような特徴があるからです。

1.メッセージダイジェストから、もとのデータ(原文等)は復元、推測できない
2.わずか1ビットでも異なるデータから作成したメッセージダイジェストは、異なる値になる
3.同じハッシュ値を持つ異なるデータ(原文等)を作成することは、ほぼ不可能

という特徴です。

原文が同じ場合は、常に同じメッセージダイジェストが生成されます。しかし、1文字でも(1ビットでも)異なる原文からは、異なるメッセージダイジェストが生成されます。

このように暗号に近い特徴があるため、デジタル署名だけでなく、タイプスタンプと呼ばれる時刻証明や暗号資産のブロックチェーン(取引記録)など、様々なところで利用されています。

また、原文のデータ量に関わらず固定のビット列に変換されるので、コンパクトに収まるというメリットもあります。

主なハッシュ関数のアルゴリズム
名称 ビット長 詳細
md5
(エムディーファイブ)
128 16進数で32文字。
ビット長が短く脆弱性が発見されているため、安全性が低く推奨されていない。
SHA-1
(シャー ワン)
160 16進数で40文字。
長年にわたり標準的なアルゴリズムだったが、現在では脆弱性が発見されており、SHA-2への移行が進んでいる。
SHA-2
(シャー ツー)
224、256、384、512 256ビットなら16進数で64文字。
現在の標準規格。SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6つの種類があり、SHA-256がもっとも利用されている。
SHA-3
(シャー スリー)
224、256、384、512 SHA-2の次世代アルゴリズム。
まだSHA-2の脆弱性については報告がないため、あまり移行は進んでいない。

ハッシュ関数の場合も、暗号のアルゴリズムと同様にビット長を長くすると安全になりますが、パソコンの高い処理能力を必要とするようになります。これも時代によって推奨されるアルゴリズムが変わっていきます。

また、先述のとおりハッシュ関数には複数のアルゴリズムがあり、古いアルゴリズムでは、異なるデータから同一のハッシュ値が生成される「衝突」を起こすことが可能で、衝突を利用した攻撃による脆弱性が指摘されています。

そのため、古いアルゴリズムは推奨されていませんが、ハッシュ値から原文を復号化できる容易な方法が発見されたというわけではなく、基本的にハッシュ値だけから原文を復元することはできません。(同じハッシュ値をもつ別のデータを生成することが可能なだけで、同じハッシュ値をもつ原文を自由に作成できるわけではない)

しかし脆弱性がある以上、現在推奨されている適切なアルゴリズムを使用することが求められます。現在では「SHA-2(SHA256)」がもっとも利用されています。SHAは「Secure Hash Algorithm」の略になります。

では、このメッセージダイジェストがデジタル署名でどのように利用されているのかというと、先述のとおり、秘密鍵で暗号化して本文に添付されることになります。

秘密鍵で暗号化されたメッセージダイジェストがデジタル署名であり、イメージとしては、書類にサインや押印するように、本文に添付するイメージになります。

デジタル署名のイメージ図

また、こうしたメッセージダイジェストの特徴を利用することによって、

本文の「改ざん」も検証することができる

ようになります。

同様に「あなた」と「花子さん」の通信を例にしてみましょう。

流れとしては、メッセージダイジェストを送信者の秘密鍵で暗号化し、「暗号化したメッセージダイジェスト」と「本文」と「公開鍵」の3点セットを「花子さん」に送ります。

そして「花子さん」は「あなた」の公開鍵でメッセージダイジェストを復号化します。

次に「花子さん」は、平文の本文からハッシュ関数を用いて新たにメッセージダイジェストを作成します。同じデータからは同じハッシュ値が生成されるはずなので、生成したメッセージダイジェストと復号化したメッセージダイジェストを比較して一致すれば、改ざんされていないということになります。

デジタル署名による改ざん検証のイメージ

もし、本文がわずかでも改ざんされていたら、2つのメッセージダイジェストは一致しません。

このように、デジタル署名には「改ざん検知」の機能が加わることとなります。

デジタル署名には3つの認証機能があると説明しましたが、

送信者が本人である証明、公開鍵が本人のものである証明、否認防止、改ざん防止

という4つの認証機能を持つことになります。

デジタル署名という名称から、本人確認だけに用いるイメージがありますが、このように多くの仕事をやってくれています。

デジタル署名によって受信者に送信者を証明し、デジタル署名とセットで送付した公開鍵で、受信者に情報を送ってもらうようにすれば安全な通信が確立します。

さて、ではこれで前項の8つの疑問は解消するでしょうか?

気づいた方がいるかもしれませんが、じつはデジタル署名だけでは、8つの疑問はまったく解決できないのです。

公開鍵暗号方式によって「盗聴」を防止し、デジタル署名によって「改ざん」と「否認」が防止できることを学習しました。しかし、デジタル署名だけでは、その中でも一番防止しなければならない「なりすまし」を完全に防止することができないのです。

どんなケースが考えられるかというと、

本文とデジタル署名と公開鍵の3点すべてを「なりすまし」によって差し替えられた場合

は見事に攻略されてしまうのです。

例えば「あなた」が「花子さん」にデジタル署名付きのメールを送る際に、悪意のある第三者「吉良さん」が、通信経路の途中で「あなた」のメールをすべて奪い取って差し替えるケースです。

デジタル署名は「あなた」の秘密鍵で暗号化されているため、悪意ある第三者の「吉良さん」は、「あなた」の公開鍵で内容を「盗聴」することも「改ざん」することも容易です。

「吉良さん」は本文を改ざんし、改ざんした本文からメッセージダイジェストを生成します。そして今度は「吉良さんの秘密鍵」でデジタル署名をします。

これですべて差し替え可能です。改ざんした本文と、それから生成したデジタル署名、「吉良さん」の公開鍵を3点セットで差し替えて「花子さん」に送信します。

この場合「花子さん」が受け取るのは、「吉良さんの本文」「吉良さんのデジタル署名」「吉良さんの公開鍵」になります。しかし、「花子さん」がメッセージダイジェストを比較すると完全に一致してしまいます。

なりすましが成功してしまう場合のイメージ

「花子さん」からすると、送信者は「あなた」であることに疑いようがなく、「吉良さん」は見事になりすましが成功します。

したがって、

デジタル署名だけでは何も証明することができない

のです。

ではどうすればよいのかですが、他の仕組みと組み合せることになります。ポイントは「公開鍵」です。公開鍵が誰のものであるのか(誰が作成して公開した鍵なのか)を証明することができればすべての問題が解決します。

どうしてそれを証明できればすべて解決するのか考えてみてください。詳しくは次項で学習します。

更新履歴

2008年11月24日
ページを公開。
2009年5月24日
ページをXHTML1.0とCSS2.1で、Web標準化。レイアウト変更。
2018年1月30日
ページをSSL化によりHTTPSに対応。
2023年3月8日
内容修正。

参考文献・ウェブサイト

当ページの作成にあたり、以下の文献およびウェブサイトを参考にさせていただきました。

情報セキュリティ入門:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060214/229302/?ST=security
電子証明書とPKI入門
http://www.verisign.co.jp/basic/pki/index.html
ハッシュ関数とは?ハッシュ関数のアルゴリズムと種類
https://elite-lane.com/hash-function/
ITの知識不足による判決間違い?-MD5の脆弱性
https://kigyou-fullsupport.com/media/column/column-667/