FineArt News

あなたがあなたであることをどう証明するか?

例えば王小明は病気で病院に薬をもらいに行く必要があり、まず自分の身元を証明しなければなりません。以下のような状況が考えられます。

  • 状況1:彼は病院に「私は有田直人です」と言います。
  • 状況2:彼は病院に「私は有田直人です。これが私の社員証のIDカードです」と言います。
  • 状況3:彼は病院に「私は有田直人です。これが私のパスポートです」と言います。
  • 状況4:彼は病院に「私は有田直人です。これが私のパスポートで、保険証もあります」と言います。

上記の例では、明らかに状況1は口頭での主張のみで、あなたを知っている人でなければ他人はあなたが有田直人であることを証明することはできません。状況2にも問題があり、私的なIDカードは容易に作成または偽造される可能性もあり、このIDカードが正式な物なのか信頼することはできません。状況3だとかなり良い状態で、パスポートは国によって発行されているため偽造される心配はほぼありません。状況4はさらに良い状態で、国によって発行されたパスポートだけでなく保険証の認証もあり、これは二重の認証になります。

以上から分かる通り、あなたがあなたであることを証明するには、第三者の証明が必要です。例えばパスポートには写真が付いているので、それは国が「あなたがあなたであること」を証明してくれるものです。もちろん、複数の信頼できる第三者が同時に「あなたがあなたであること」を証明する二重認証があれば、さらに安全といえます。上記の例で言えば、パスポートと保険証があれば二重認証になります。

このプログラムが本当にあなたが実行したいプログラムであることをどう証明するか?

この表現は少し回りくどいですが、例えば、WINWORDを実行したいときに、そのWINWORDがマイクロソフトから提供されているWINWORDであること、そしてハッカーが偽造したWINWORDという名前のプログラムではないことをどうやって確認しますか?

ファイル名だけを見てそのプログラムを実行するのは非常に危険です。先程の例のように、ファイル名だけではプログラム自身を証明することはできません。プログラムの身分証明書である「署名」を使って証明する必要があります。

プログラムの署名によってプログラムの身分を証明することができますが、一般的には署名ツール+証明書を使用して、プログラムの発行前に署名を追加することができます。具体的には、プログラムの末尾に一連のコードを追加して、(1) プログラムが変更されていないこと、(2) 特定のソフトウェアメーカーに属していることを証明します。

プログラムの署名アルゴリズムは、通常は公開鍵のスキームを使用して、証明書を利用してプログラムに署名します。詳細なアルゴリズムに興味がある方は、インターネットで公開されている情報を参照してください。ここまでの話をまとめると、証明書があれば(証明書から署名を生成して)プログラム自身を証明できるということです。

しかし、実は署名生成ツールを使えば誰でも自分の証明書を生成することが可能で、自分で生成した証明書を使用してプログラムに署名することもできます。そのため、プログラムに署名がある場合でも、そのプログラムが信頼できるとは限りません。証明書の生成プロセスを考えると誰でも証明書を生成することができるため、証明書自体が偽造される可能性もあります。

したがって、プログラムが信頼できるかどうかを判断する主な基準は、その証明書が信頼できるかどうかによります。自分で生成した証明書は、まず第三者から信頼されることはありません。前述の状況2の(偽造しやすい)IDカードのように、公的に認められていない物には信頼性はありません。そのため、証明書の発行業務を専門として行っている企業もあります。これらの会社はより信頼性があり、世界中のユーザーから信頼されています。特に有名なのはGlobalSign、Verisignなどがあります。

電子認証局の団体に証明書を申請して年会費を支払うと、電子認証局は地方公共団体の状況に基づいて申請者の信用調査を行い、申請情報が事実に合致すると確認された場合、電子認証局が発行する証明書を購入することができます。このような証明書を使用してプログラムに署名すると、アプリケーションのユーザーから信頼されます。なぜなら、第三者の電子認証局が署名者の証明書が正しいことを証明し、この証明書でプログラムに署名されているため、電子認証局を信頼する前提で電子認証局が発行した証明書に署名されたプログラムを信頼できるからです。

この状況は上述の状況3と同様で、電子認証局が発行した証明書は、「このソフトウェアが確かに某ソフトウェア会社によって開発された」ということのみを限定的に証明できるに過ぎません。そのソフトウェア会社が開発したソフトウェアに問題がないか?隠されたハッカーのツールがないか?などは署名からは分かりません。ファイルエクスプローラーを使用して、ファイルの[右クリック]から[プロパティ]を選ぶことで署名を確認できます。下の表は一般的なアプリケーションの署名であり、アプリケーションがハッカーによるファイル名偽装されるのを防ぐことができます。一般的なプログラムに署名する場合は、一般的な証明書の申請だけで十分です。(もちろん自分で証明書を生成してその証明書を使って自分のプログラムに署名することもできますが、それでは信頼性がありません)Windows Kernel Mode Driver(コアドライバー)を開発する場合は、(1) 第三者認証の(より厳格な審査の)EV証明書を申請してドライバーに署名する、(2) Microsoftの審査を受けた後にMicrosoftの署名が追加されます。Microsoftの署名があるとWindowsの起動時にこのドライバープログラムでコアにロードすることが許可されます。

いわゆる第三者認証の強化型EV証明書とは、電子認証局が申請者の信用を調査する際にさらに詳細な情報を求めるもので、EVの申請費用も高くなります。ドライバーはより高度な信頼が求められるため、強化型の署名を使用したドライバーをMicrosoftの審査に提出し、審査承認後にMicrosoftの署名が付されます。Microsoftの署名があると、Windowsが起動する際にそのドライバーをロードすることができます。これは上記の状況4と同様で、ドライバーがEV署名とMicrosoft署名の両方をもって初めて、そのドライバーが信頼できることを証明できます。

結論

下表は各プログラムの大まかな信頼度を示しています。

種類 個人署名 公信力のある署名 EVコード署名 マイクロソフト署名 説明
一般プログラム         信頼できない
一般プログラム ✔︎       信頼できない
一般プログラム   ✔︎ Option   信頼できる
ドライバプログラム     ✔︎ ✔︎ 信頼できる

最後に、アプリケーションに対して有料の信頼できる証明書を使用して署名を行っても、プログラムの発行者が特定のソフトウェア会社であることを証明できるだけで、プログラムに悪意のある機能が含まれていないか、または利用可能な脆弱性がないかを証明することはできません。

通常は、特定のソフトウェア会社が開発したアプリケーションであることが証明されれば十分で、そのソフトウェア会社を信頼することにより、開発されたプログラムも同時に保証されることになります。しかし、この信頼は心理的なものであり、技術的な手段では、アプリケーションの署名がそのアプリケーションが特定の会社によって開発されたことを証明することしかできません。