29

私のアプリケーションは3つのアセンブリで構成されています。2つのDLLを参照する1つのEXEです。DLLは私のアプリケーション専用であり、この実行可能ファイルによってのみ使用されます。

これらのアセンブリには強い名前を付ける必要がありますか?

FxCopは、現在作成しているすべてのアセンブリについて、次のことを行う必要があることを示唆しています。

CA2210:厳密な名前キーを使用して<アセンブリ>に署名します。

ただし、このアドバイスは次のように述べています。

一般に、アプリケーションのEXEアセンブリに厳密な名前を付けることは避けてください。

アプリケーション専用の厳密な名前のコンポーネントは避けたい場合があります。

これらのアセンブリに強い名前を付ける必要がありますか?この場合、そうする(またはそうしない)ことの利点は何ですか?

編集:

同様の構造を持ついくつかのアプリケーションを見ると、この問題についてのコンセンサスはないようです。Paint.NETCrack.NETのバイナリには名前が付けられていませんが、 .NETReflectorSnoopのバイナリには名前が付けられています。

興味深いことに、Expressionスイートでは、Microsoftは後者のアプローチを採用しています。たとえば、Expression Blendでは、Blend.exeと付随するDLL(Microsoft.Expression.Blend.dllなど)の両方に厳密な名前を付けることを選択しました。

「これらのアセンブリに強い名前を付ける必要がありますか?」という最初の質問に対する簡単な答えを受け取る可能性は低いようです。しかし、私の2番目の質問はまだ立っています:

この状況で強力な名前の署名バイナリにメリットはありますか?または、そうしないことの利点はありますか?

編集2:

どちらにせよ、圧倒的な理由がなければ、私は自分のアセンブリに強い名前を付ける傾向があります。したがって、私は誰かがこれを(最初のリンクから)拡張できるかどうかに興味があります:

「強い名前を付けると、依存関係の管理がより困難になり、プライベートコンポーネントに不要なオーバーヘッドが追加される可能性があります。」

4

4 に答える 4

16

私が見ているように、これらはこの状況での強い名前の署名の利点です。

  • 攻撃者が、EXEを置き換えることなく(EXEには公開鍵を含む参照が含まれているため)、別のキーを使用して署名された(またはまったく署名されていない)DLLを置き換えることを防ぎます。
  • 攻撃者が既存のキーを保持したままアセンブリを変更するのを防ぎます(これにより署名の検証が失敗するため)。ただし、.NET 3.5 SP1以降、この状況での署名検証はデフォルトで無効になっていることに注意してください。
  • アセンブリのバージョンが一致しないアプリケーションの実行を妨げる可能性があります-デプロイメントエラーのためにDLLが誤って置き換えられた場合、アプリケーションは(互換性がない可能性のある)間違ったバージョンを使用しようとするのではなく、DLLのロードに失敗します。
  • FxCop警告を回避します。

そして署名の欠点(これらはリンクされた記事が言及しているものだと私は信じています):

  • DLLを互換性のある新しいバージョンに置き換えるには(たとえば、バグを修正するために)、EXEを置き換える必要があります。
  • .NETバージョン<3.5SP1では、署名の検証により、厳密な名前のアセンブリのロードに時間がかかります。
  • ローダーがローカルで検索する前にGACの(この状況では無駄な)検索を実行するため、厳密な名前のDLLもロードに時間がかかります。

選択が厳密な名前付け(したがって、正確なキーと正確なバージョンに一致する参照を必要とする)であるか、厳密な名前付けではない(そしてどちらも一致する必要がない)ことは残念に思われます。キーを要求することは可能であるが特定のバージョンを要求することができなかった場合、最初の欠点を取得することなく、署名の最初の2つの利点を取得できる可能性があります。おそらくこれは、厳密な名前を適用してから、app.configを使用してバージョン管理の問題に対処することで可能になりますか?

于 2010-02-17T02:44:55.877 に答える
5

強力なネーミングアセンブリは、バージョンの互換性のみを保証します。これは、アセンブリを信頼することと同じではありません。

言い換えると、「厳密な名前」とは、コンパイル時に使用されていたバージョン番号と組み合わせた正確なアセンブリバイナリのみを指します。

これらのアセンブリをGACする場合、CLRはそれを1回だけ検証します。その時点で、アセンブリはgacされています。これにより、パフォーマンスが向上する可能性があります。しかし、私の経験では、それは最小限であることが示されています。

強い名前のアセンブリは、強い名前のないアセンブリに置き換えることができます。これは、いかなる種類のセキュリティ機能でもない強力な命名に関する部分をもたらします。

私の個人的な意見は、それらに関連する痛みのレベルはそれらの使用を正当化しないということです。苦痛は、自動テストツールをどのようにねじ込むかです。

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5054496.html

于 2010-02-17T00:26:02.783 に答える
4

アセンブリに署名すると、コンパイル後にアセンブリが変更されないようになります。そして、あなたが唯一の秘密鍵の所有者である限り、誰もあなたの鍵でアセンブリを辞任することはできません。

もちろん、これは絶対的な保護ではありません。ハッカーは、アセンブリを変更し、すべてのアセンブリから厳密な名前の署名(および参照)を削除できます。これらのアセンブリも機能します。

しかし、そのような場合、あなたは修正があなたによってなされていないと言うことができます。

于 2010-02-16T08:34:03.747 に答える
1

アセンブリに署名する場合、参照されるアセンブリはすべて公開され、署名する必要があります。そうしないと、正当な理由でコンパイルエラーが発生します。

アセンブリに強い名前を付ける主な用途は、それをGACに取り込むことだと思います。

exeに強い名前を付ける必要はないと思います。

ちょうど私の2ペソ....

于 2010-02-15T20:57:38.330 に答える