ウェブサイト検索

ソフトウェアの署名の美しさ


あなたがソフトウェア開発者だと想像してみてください。そして、あなたのソフトウェアやその更新をインターネット上で共有します。どのようにして誰かがあなたのソフトウェアを改ざんして、その改ざんされたコピーを顧客に配布しないようにしますか?その解決策はソフトウェア署名です。この署名がどのように機能するかは、まったく巧妙で魅力的です。

ソフトウェアの署名とは何ですか?

私たちは自己確認のために手書きの署名を使用します。それには二つの理由があります: それらは検証可能であり、偽造することが不可能だからです。同じ原則が、コンピュータにあるソフトウェアのコピーが本物であり、いかなる形でも改ざんされていないことを確認しようとする際にも適用されます。開発者はソフトウェアパッケージにデジタル署名を残し(これは偽造できません)、顧客はソフトウェアをインストールする前に自分のコピーのその署名を確認します。

ソフトウェアの更新についても同様です。悪意のある更新(たとえば、ドライバーに偽装されたマルウェア)は、あなたの機械に大混乱を引き起こす可能性があります。あなたのオペレーティングシステム(Windows、macOS、またはLinuxのいずれか)は、システムにインストールする前に、その更新が元のソースから来ていることを確認する必要があります。

デジタル署名は手書きの署名と同じ2つの仕事を果たすためのものですが、実際の仕組みは全く異なります。デジタル署名を作成し、検証するためには非常に巧妙な暗号技術のトリックが必要です。

目に見える場所に秘密のメッセージを隠す方法

例えば、手書きのメモを使って友達と秘密を共有したいとします。このシナリオでは、あなたはそれらを公共の場所に置いておく必要があります。通り過ぎる誰かがそのメモを拾って、あなたの秘密を読むことができてしまうかもしれません。だから、私たちの問題は、周りに忍び寄る誰かがメモを手に入れた場合でも、どうやってあなたの友達だけがメッセージを読めるようにするかです。

賢い方法は、この共有された秘密をロックおよびアンロックするために「鍵」を使用することです。説明させてください。

あなたと友人はキーに同意し、そのキーを使用して秘密のメッセージをナンセンスな音に変換します。キーは何でもかまいません。たとえば、あなたたちはメッセージのすべての文字をアルファベットで隣接する文字に置き換えることに同意することができます。

それでは、あなたはメッセージを取り、それに含まれるすべての文字をキーに従って置き換えます。つまり、メッセージ「SECRET」は「TFDSFU」になります。「TFDSFU」と書かれたメモを作成し、それを公共の場に置きます。あなたの友達は、以前に交換したキーを持っているので、それを解読できます。したがって、彼らがする必要があるのは、「TFDSFU」の各文字を1つずつシフトすることだけで、元のメッセージ「SECRET」を得ることができます。いかなる盗み聞き者も、メッセージを理解するにはまずキーが必要なため、無意味なものしか見ることはできません。

ここで説明したことは非常にシンプルな暗号技術で、使用される鍵は基本的なシーザー暗号です。

コンピューターがインターネット上で秘密のメッセージを送る方法

さて、インターネット上で同じことをしていて、コミュニケーションを完全に安全に保ちたいと想像してみてください。現実の世界では、事前に会ってお互いに鍵を交換することができます。しかし、インターネットでは公共の場であるため、そのように鍵を交換することはできません。誰でもその鍵を拾ってしまい、あなたのコミュニケーションの残り部分を解読することができるのです。それでは、友達と鍵を共有せずにどうやって鍵を交換するのでしょうか?

したがって、安全に通信するためには鍵が必要ですが、まずその鍵を安全に伝える必要があります。これが、2つのコンピュータがその鍵をインターネット上で送信することなく、同じ鍵に合意する方法です。

あまり技術的にならないように言うと、暗号化は一方向では簡単に解ける数学的方程式を使い、逆方向では非常に難しい(時には不可能な)ものです。したがって、もしコンピュータが正しい数値がすべて含まれる方程式を持っていれば、それを簡単に解くことができます。しかし、もし解決策が与えられたとしても、その方程式自体を逆解析することは不可能です。

ここでは非常に単純化していますが、そうしないと一日中ここにいることになります。これがどのように機能するかを深く掘り下げたい場合は、ディフィー・ヘルマン鍵交換について調べてみてください。

シナリオはこうです:コンピュータA、コンピュータB、そして公共スペースがあります。まず、公共スペースにキーが送信されます(これを公開鍵と呼びましょう)。コンピュータAは別のキーを作成し、それを秘密に保ちます(これを秘密鍵Aと呼びましょう)。コンピュータBも同様のことをします。

公開鍵は誰でも利用できますが、プライベートキーAとプライベートキーBはそれぞれのコンピュータに安全に保管されています。

今、コンピュータAは公開鍵を取得し、それを自分の秘密鍵と組み合わせて組み合わせを作成します。コンピュータBは自分の秘密鍵で同じことをします。両方の組み合わせは異なります。コンピュータは秘密鍵を公開スペースに送信するのではなく、これらの組み合わせを送信します。

これらの組み合わせを逆算して、それらを作成するために使用された秘密鍵を見つけることは不可能であることを忘れないでください。そして、2台のコンピュータが互いの秘密鍵を見ることはありません。

さて、実際のトリックです。それぞれのコンピュータは、もう一方が公のスペースに送信した組み合わせを取得します。それからコンピュータAは、その組み合わせに自分のプライベートキーを加えて最終キーを得ます。もう一方のコンピュータも自分のプライベートキーを使って同様にして、コンピュータAが作成したものと全く同じ最終キーを得ます。

今、両方のコンピュータは、すべての将来の通信を暗号化および復号化するために使用できる同じ鍵を持っています。これが単純化された答えです:2台のコンピュータは、実際には鍵そのものを共有することなく、自分自身の鍵のコピーを「作ります」。

このプロセスは公開鍵暗号と呼ばれています。このタイプの公開鍵暗号は、ソフトウェア署名のようなデジタル署名の基礎となっています。

開発者がコードに秘密の署名を隠す方法

デジタル署名ソフトウェアには、公開鍵と秘密鍵も関与します。しかし、目的が異なるため、内部の動作も少し異なります。ここでの考えは、安全な通信ラインを確立することではありません。我々が求めているのは、一方向の検証だけです。ソフトウェア開発者は、ソフトウェアパッケージの内容を隠そうとはしていません。彼らが関心があるのは、パッケージの出所を証明することだけです。

それで、開発者は一対の秘密鍵と公開鍵を作成します。これらの鍵は異なることを覚えておいてくださいが、数学的には関連しています。そして、一方の鍵から他方の鍵を逆算することは不可能です。

開発者は、ソフトウェアパッケージを暗号化するために秘密鍵を使用します。その暗号化されたコピーは、彼らがすでにインターネット上に公開した公開鍵によってのみ復号できます。したがって、あなたと私が公開鍵を使用してそのコピーを復号化するとき、開発者だけがソフトウェアパッケージを元々暗号化することができた秘密鍵を持っているため、それが開発者から送信されたものであると確信できます。

ハッシュは作業を楽にする

さて、少し嘘をつきました。実際にソフトウェアパッケージ全体を暗号化するのは実用的ではありません。なぜなら、これらのファイルは非常に大きくなる可能性があるからです。この問題を解決するためのもう一つの巧妙な方法があります。それはハッシュ関数を用いることです。ハッシュ関数は、任意のサイズのファイルから固定長の数字と文字を作成する数学の公式です。

例えば、SHA256ハッシュ関数は、任意のファイルを取り、そのファイルから256桁の数字と文字のリストを出力します。そのファイルがたった1ビットでも変更されると、全く異なる結果が生成されます。したがって、開発者はソフトウェアパッケージをSHA256関数に通してテキストファイルを生成します。そして、全体のパッケージを暗号化する代わりに、彼らはこのテキストファイルをプライベートキーを使って暗号化します(上で説明した通りです)。彼らは暗号化されたハッシュテキストをソフトウェアパッケージに添付し、それを私たちに送ります。

私たちがソフトウェアパッケージを受け取った時、SHA256でも実行して、独自のハッシュリストを取得します。その後、開発者が提供した公開鍵を使って、ソフトウェアパッケージに添付された暗号化されたメッセージを復号化します。復号化されたハッシュリストが私たちが生成したリストと一致すれば、このパッケージが開発者から来たものであり、改ざんされていないことが確実になります。輸送中のパッケージの改ざんは、全く異なるハッシュテキストをもたらします。これらのテキストファイルはチェックサムと呼ばれます。

要するに、それがソフトウェア署名の正体です:暗号化されたハッシュと公開鍵です。デジタル署名は作成できないため(秘密鍵がそれを保証し)、検証可能です(関連する公開鍵がメッセージを復号できます)。

誰が監視者を監視するのか?

もしあなたが注意を払っているなら、このシステムにはまだ私たちが対処していない一つの欠陥があることに気づいたかもしれません。

誰かがソフトウェアパッケージのコピーを取り、それを弄り、新しいチェックサムを作成し、新しいキーのペアを使って暗号化した場合、何が起こるでしょうか?その脅威のある行為者は、関連する公開鍵を広めるか、私たちに直接送ることができます。私たちは、ハッシュが一致していると思ってしまい、改ざんされた署名を公開鍵を使用して復号化します。そうすれば、それは元の著作者からのものであるはずです。しかし、私たちが使用した公開鍵は詐欺師のものでした。

そこに認証機関が登場します。そのような信頼できる組織が開発者を審査し、彼らの公開鍵に関連付けられたデジタル証明書を授与します。これは、開発者が私たちのために行うように、証明書を暗号的に署名します。そして、さらなる高位の認証機関がこの組織の署名を保証します。認証組織がすべての下に存在しているのです。

これらの証明書は法的に拘束力があり、私たちは自社で確認して正しい公開鍵を取得できていることを絶対に確かめることができます。


これらすべての事柄は、自動的にバックグラウンドで発生します。なぜなら、コンピュータがハッシュ化、暗号化、検証を処理するからです。私たちはただ、アプリのインストールや更新の許可を求めるダイアログを目にします。アプリが署名されていない場合、オペレーティングシステムはインストールする前に警告します。

関連記事: