私が引き継いだいくつかのC#コード(Visual Studio 2005)では、アセンブリがすべて同じ.snk
ファイルで署名されていることに気付きました。
- なぜ前の著者はこのように議会に署名したのでしょうか?
- アセンブリに署名する必要はありますか?署名しないと何が問題になりますか?
- アセンブリの署名にはどのような欠点がありますか?遅延の原因になりますか?
私が引き継いだいくつかのC#コード(Visual Studio 2005)では、アセンブリがすべて同じ.snk
ファイルで署名されていることに気付きました。
回答:
なぜ前の著者はこのように議会に署名したのでしょうか?
わからない、多分彼はすべてのアセンブリに同じ鍵で署名したかったのかもしれない。
アセンブリに署名する必要はありますか?アセンブリに署名しないと何が問題になりますか?
いいえ、必要ありませんが、アセンブリの信頼性を保証できるメカニズムです。これにより、アセンブリが改ざんされていないことを確認できます。実際、この作成者が作成したものです。それらをGACに配置する場合にも必要です。
アセンブリの署名にはどのような欠点がありますか?遅延の原因になりますか?
署名されたアセンブリは、他の署名されたアセンブリのみを読み込むことができます。また、特定のバージョンに関連付けられているため、別のバージョンを使用する場合は、バインディングリダイレクトを使用するか、アプリケーションを再コンパイルする必要があります。署名の検証のため、パフォーマンスのオーバーヘッドも少しありますが、気にする必要がないほど小さいです。
アセンブリをGACに配置する場合は、アセンブリに署名する必要があります。
実行可能ファイルに署名する場合、リンク先のクラスライブラリも署名する必要があります。サードパーティのライブラリを使用している場合(特に、ActiveXコントロールなどを使用する必要がある場合)、これは難しい場合があります。
Richard Grimesが.NETのセキュリティに関する優れたワークショップを書いており、これには次の章が含まれています:Security Workshop
すべてのアセンブリが同じ.snkファイルで署名されている理由は、コードカバレッジを使用したユニットテストを使用した場合です。コードカバレッジを実行できるようにするには(少なくともVisual Studio 2005のテストバージョンに組み込まれているツールを使用して)、アセンブリが署名されている場合、署名に使用される.snkファイルを指定する必要がありますが、ソリューション全体に対して1つの.snkファイルを指定するので、さまざまな.snkファイルでさまざまなクラスライブラリに署名する場合、一度に1つの.snkファイルのコードカバレッジのみをチェックできます。
アセンブリに署名する非常に重要な理由は、アセンブリであることを確認できるようにするためです。秘密キーはあなたのものなので、他の誰も同じキーでアセンブリに署名することはできません。これは、アセンブリの公開キーが既知のものである場合(GetType().Assembly.GetName().GetPublicKey()
関数を使用してこれを取得できる)、アセンブリはあなたのものであり、改ざんされていないことを意味します。
署名dllのすべての使用方法にもかかわらず、dllは2つの理由でのみ署名されるべきです
1.バージョン管理
2.認証
a。バージョン管理は、dllがビルドされているバージョンを示し、GACにそれらをプッシュしている間、同じ名前の2つのdllが存在する可能性がありますが、バージョンが異なります
b。認証は、dllが改ざんされていないかどうかを示し、作成時と同じように存在します。
既存の回答に加えて、DLLがサードパーティのソフトウェアによって動的に読み込まれて使用される場合は、署名を使用する必要があることを付け加えます。それ自体は技術的な要件ではありませんが、サードパーティのソフトウェアプロデューサーがセキュリティ上の懸念によりこのようなポリシーを適用することは合理的であり、非常に一般的です。
アセンブリに署名する必要がある例: