2011-07-27 4 views
1

私のアプリケーションでは、自分の付属のアドインと他のアドインを区別する必要があります。
それぞれ異なるキーで署名されているため、ホストアプリケーションもあります。アセンブリの身元を確認しますか?おそらくそれは強い名前であろうか?

私のアセンブリを他のアセンブリと区別する方法はありますか? (おそらく署名キーの助けを借りて)

+0

この場合、あなたのアセンブリを他のアセンブリと区別する目的は何ですか?つまり、あなたのアプリケーションはあなたのアセンブリを他のアセンブリとは違ってどのように扱いますか? –

+0

私のアプリは、私にライセンスされているライブラリのみを使用しているためです。アドインの開発者はライセンスを持っていませんし、そうであれば私に連絡するように依頼します。 – Vercas

+0

アプリケーションにランタイムライセンスがある場合、なぜアドインをポリシングする必要がありますか?ライブラリの開発者が設計時のライセンス制限を適用する場合、設計時にはアドイン開発者に適用されますが、実行時に追加のチェックを行うべきではありません。 –

答えて

2

あなたはどちらかGetPublicKey()またはGetPublicKeyToken()

Assembly a =... 
a.GetName().GetPublicKeyToken(); 

Assembly a =... 
a.GetName().GetPublicKey(); 

使用することができますし、GUIDのリストを維持するよりも便利になり、あまりにも将来のアセンブリで動作します。

+0

2つの違いは何ですか? – Vercas

+0

GetPublicKeyToken - 8バイトのトークン「公開鍵のSHA-1ハッシュの最後の8バイト」のみを返し、2番目が公開鍵を返します。 – elevener

+0

公開鍵自体を使用すると、より安全になりますか? – Vercas

4

コンテナアセンブリに格納されている一覧に対して、読み込まれたアセンブリの公開キートークンを確認できます。

http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

それとも、単にこのようなアセンブリの完全名を格納します。

var assembly = typeof (string).Assembly; 

var myAssemblies = new HashSet<string> 
{ 
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
}; 

Assert.IsTrue(myAssemblies.Contains(assembly.FullName)); 

また、あなたはGetPublicKeyTokenを使用して、トークンegainst確認することができますし、BitConverter

var assembly = typeof(string).Assembly; 

var token = BitConverter.ToString(assembly.GetName().GetPublicKeyToken()).Replace("-","").ToLowerInvariant(); 

var expectedToken = "b77a5c561934e089"; 

Assert.AreEqual(expectedToken, token); 
+0

私は不思議です、他の誰かが何とか同じ公開鍵でアセンブリを作ることはできませんか? – Vercas

+2

キーファイルがある場合、通常セキュリティ保護された資産として管理されます。 –

+1

アセンブリの公開鍵トークンを任意に変更することができます。 PublicKeyTokenをチェックするだけで、偽の鍵を検出することはできません。 – foxy

1

少し素敵なスニペット:

// Assembly is a System.Reflection.Assembly 
public string GetAssemblyGUID(Assembly assembly) 
{ 
    object[] objects = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false); 
    if (objects.Length > 0) 
     return ((System.Runtime.InteropServices.GuidAttribute)objects[0]).Value; 
    else 
     return null; 
} 

これは、指定されたアセンブリのGUIDを取得します。プロジェクトプロパティで、アセンブリのGUIDを設定できます。これはクラスライブラリとPEに当てはまります。すべてのアセンブリが署名されている場合は

+0

だから、私はaddinのGUIDを取得し、自分のリストに対してチェックします。しかし、別のアドインが自分のGUIDを使用できないのはなぜですか? – Vercas

+0

@Vercas、何もありません。防止機構はありません。それはすべて「良い市民になる」ことです。見てみましょう...あなたのアプリケーションが署名されたとは言わなかったのですか?そうであれば、鍵の署名をチェックするだけではどうですか?最後に、すべてのアセンブリの一部のハッシュ(MD5、CRCなど)を行い、それを自分と比較することもできます。 – foxy

+0

何もない、それらは交差する可能性があります –

2

これは、厳密な名前の署名をチェックすることで実現できます。これについては、Checking For A Valid Strong Name Signatureを参照してください。この記事ではStrongNameSignatureVerificationExでP/invokeを使用していますが、.NET 4.0以上を使用している場合はICLRStrongName::StrongNameSignatureVerificationExを置き換える必要があります。

実際には公開鍵トークンについてはPublic Keys and Public Key Tokensを参照してください。公開鍵のハッシュであるため、信頼できないアセンブリに簡単に複製または抽出して注入することは、アセンブリを検証するための安全なメカニズムではありません。

関連する問題