2009-07-28 20 views
90

私の同僚の一人は、アセンブリに署名することに非常に熱心です。彼は文字通り何かに署名しようとします。署名されていないMicrosoftのアセンブリを使用する場合でも、ソースコードを取得して署名し、代わりに他の開発者に依頼するよう依頼します。.NETアセンブリに署名しないと何も問題はありませんか?

私は、アセンブリに署名の基本的な考え方を理解することができます:特定のアセンブリは、いくつかの危険なハッカーによって損なわれていないことを確認します。ソフトウェア開発会社であれば、.NETライブラリを顧客にリリースする前にアセンブリに署名する必要があります。

しかし、私たちは主にここに私たち自身の使用のためのWebアプリケーションを開発する、と私はちょうど私たちが使用するすべての単一のアセンブリに署名のポイントを見ることができません。

ここに何か不足していますか?

+1

ここでは、「デジタル署名」(セキュリティ目的を持っています)と「厳密に名前付きのアセンブリ」があります。これはdllの不具合を修正し、GACがライブラリにリンクするのを助けます。 1つまたは別のものを使用することは同様であり、両方ともアセンブリに署名するという点で言える。いくつかのポスターがあるものを考えているように見え、他の人が別のものを考えているようです。 – amalgamate

答えて

47

信頼できる環境で使用されている署名アセンブリは、私にとって過剰な音です。署名済みのアセンブリ上の

興味深い点は、彼らが暗号的に検証されなければならないとして、符号なしのアセンブリよりもロードにわずかに遅いということです。それはまた、署名されなければならない依存する任意のアセンブリをアセンブリに署名するために

。私の推測では、これは皆さんの同僚がすべてに署名したいという欲求に貢献するということです。コンパイラはそれを要求しています。


EDITこの答えを書いているので、あなたはプロとキャンプの両方に対しては、ほぼ同等のサポートを持って見ることができます。明らかに正解はありません。しかしこの編集を余儀なく

ポイントは、今日我々がNuGetから非常に多くのオープンソースライブラリを取り、それらの多くが全く署名されていないということです。あなたがあなたのアセンブリに署名したいのであれば、依存関係も署名されている必要があります。署名されたオープンソースライブラリの多くは、ソースリポジトリで一般に公開されている署名に使用される秘密鍵を持っています。

すべてのものと同様に、トレードオフが行われます。私のプライベート環境での仕事の経験では、政府機関があなたのコードを変更することを心配している場合を除き、署名の利点は主に理論的(または学問的、@user289100の言及)です。インフラストラクチャーは少量の努力のように思えるでしょう。さもなければ、すべてに署名することからカスケードする挑戦の量はちょうど価値があるように思われません。しかし、あなたの環境には異なる要件があるかもしれません、あるいはあなたはマゾイストかもしれません!

は、厳密な名前を使用するときにバージョン管理アセンブリに関連する課題にもTeun D's answer情報については、を参照してください。

+17

合意した、それは今彼にクラック中毒のようなものだ – Janie

+3

もう1つ注目すべき点は、このアセンブリを別のアプリケーションで共有したい場合、署名は必須(GAC)です。 –

3

私はそれが少し浪費のように思えます。ファイルがあなたが思っているものであることを保証するためには本当に必要です(改ざんされていない)。しかし、あなた自身のネットワークセキュリティとWebサーバーの境界を信頼するならば、あなたのWebアセンブリに署名することは冗長なステップのようです。

しかし、それは私の小企業の経験で話すかもしれません。ミッションクリティカルなオンラインバンキングWebサイトについて話している場合は、サインオフしてください。

9

あなたの同僚はについて何か指示を与えましたか?あなたはアセンブリに署名するのが好きですか?ここでまだ議論されていない署名の利点の1つは、署名されたアセンブリのみをGACに入れることができることである。管理されたプロセス間で共有することができますが)、マイナス面を上回っていると思われます。

自己署名マイクロコードに関するあなたの逸話は特に私には疑わしいようです。 MSがコードに署名しなかった場合、おそらく理由があるでしょうか?それを署名することで、あなたがそれを書いていないときにあなたは責任を取っています。将来のためにあなたを噛むもう1つの機会です。

+2

なぜ私は確かにわかりませんが、マイクロソフトはEnterprise Library 3.1に署名しませんでした – oscarkuo

+1

なぜプロセス間でアセンブリを共有するには、アセンブリをGACに入れる必要がありますか? –

+4

実行時の参照を同じ.dllに共有することはできません。厳密な名前(つまり署名付きのもの)のアセンブリのみがGACに入ることができ、アセンブリは共有できるようにGACに配置されます。 –

4

アセンブリに署名するもう一つのことは、あなたの代わりに間違ったものを挿入することができないことです(また、あなた自身も事故によって)。たとえば、アセンブリを参照するプログラムを作成する場合は、バージョン1.0のFoo.dllを使用して、同じバージョンのアセンブリを作成して置き換えることができます。ライブラリに署名すると、少なくとも私はそれが簡単に可能だとは思わない)。

4

シグネチャは、アセンブリがGACに配置されている場合にのみ必要です。 署名されたアセンブリは、誰かがそれらを混乱させるのを防ぎません。ハッカーは依然として署名と、署名をチェックする他のコードを取り除くことができます。

+2

Webアプリケーションの場合、ハッカーはweb.configも変更する必要があります。 – Tangurena

+3

ハッカーがアセンブリからシグネチャを削除できる場合、web.configはそれらを停止しません。 – ZippyV

+4

落札者は、http://ianpicknell.blogspot.com/2010/02/tampering-with-strong-named-assembly.htmlとその記事からリンクされている同様の記事を読むことをお勧めします。 – Constantin

2

あなたが何かを発送したり、実際にそれを行う理由があるなら、それをやろうと考えてください。他のすべてのケースでは、それはただ面倒です。私はあなたのワークメイトに実際にこれを行うことを求めています。

私は以前に署名したアセンブリに遭遇しました。特に、アセンブリに署名する知識がほとんどない人、それが何であり、どのようにしているのかを考えると、後部の痛みです。絶対に必要な場合を除き、心配する必要はありません。

38

1つの追加ポイント:アセンブリに署名すると、バージョンとの下位互換性が失われます。あなたの参照にすべてバージョン番号を含めるようになり、他のバージョン番号のバージョンは互換性がないとみなされます。これにより、新しいバージョンの分散アセンブリへのアップグレードが妨げられます。私の意見で

、あなただけのコード記号アセンブリべきあなたはそれからいくつかの具体的なゲイン見れば:あなたは信頼できない人は、特定のプラグインで、あなたのアセンブリ

  • に触れる可能性がある環境に展開する場合

    • をあなたのコードを他の署名済みコードから呼び出し可能にする必要がある場合(例えばlog4netのようなプロジェクトでは、コードが広く使用可能であることを正当な理由として署名しています;数年前に秘密鍵を失うことによる互換性、コード署名の別のリスク)。
    • あなたはGAC
  • 59

    にデプロイしたい場合、私はそれが重要だ、なぜ人々を示す学術設定の前とで問題を回避するために、非署名アセンブリを利用して撮影しました。私は署名されていない(学術的な設定で)DLLファイルを同じ名前、同じ署名で作ったDLLファイルに置き換えて、元のコードをコピー&ペーストするために.NET Reflectorを使用しましたが、私の場合は、実際のコードを呼び出す前に渡されました。

    署名した場合、署名は一致させることはできますが、置き換えはできません。 Zippyの言うこととは対照的に、実行時の合併症のエラーが発生します。

    署名アセンブリが過度に使用されることはありません。 30秒かかります。それはあなたが国に住んでいる場合、あなたのドアをロックすることは過剰です。あなたの持ち物で賭けたいなら、それを開いたままにしてください。解雇されるのは1回のセキュリティ違反だけです。アセンブリに署名するのに30秒しかかからず、そうでないビジネスケースはありません。パフォーマンスの影響は無視できます。

    +11

    ハッカーがdllを変更できる場合、dllを呼び出すアプリケーションを変更することもできます。 – ZippyV

    +12

    これは正しいZippyですが、アプリケーションに署名する鍵がなければ、元のアプリケーションの署名付きバージョンのみを実行できる環境でアプリケーションを実行するのは困難です私が取り組んできたいくつかの環境あなたは木の森が欠けています:アセンブリに署名しないためには、30秒の避けが必要な不必要なセキュリティリスクがあります。アセンブリに署名しないでください。 – user289100

    1

    アセンブリをWebからの配布で使用する場合は、アセンブリに署名する必要がありますClickOnceXBAP

    さらに、すべての参照アセンブリにも署名する必要があります。私たちは、時間があるので、我々は次のようなエラーが出たときに、私たちのアセンブリに署名する(この1つはテストからですが、アプリケーションの実行時に発生する可能性があります)

    1

    :我々が見つけた

    System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 
    
    TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 
    

    をそののVisual Studioが間違っていて、が古いコードを実行しています。

    古いコードを実行している場合にエラーが発生する場合は、アセンブリに署名してください。

    nugetパッケージを書いている場合は、に署名してください。署名されていないアセンブリは、私たちがコードの最新バージョンを確実に実行していることを確認したいと思っている私たちにとっては厄介です。 Visual Studioを修正できません。私ができることは、Visual Studioが間違っていることを検出することだけです。 したがって、ナゲットアセンブリに署名してください。

    +0

    あなたのポイントは、署名よりもアセンブリバージョンに関連しています。 –

    関連する問題