在我的某个应用中,我必须将自己添加的插件与其他插件区分开来 它们使用不同的密钥进行签名,主机应用程序也是如此。
有没有办法将我的装配与其他装配区分开来? (可能在签名密钥的帮助下)
答案 0 :(得分:4)
您可以针对存储在容器程序集中的列表检查加载的程序集公钥标记。
或者只是简单地存储程序集的全名,如下所示:
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和BitConverter检查egenst标记
var assembly = typeof(string).Assembly;
var token = BitConverter.ToString(assembly.GetName().GetPublicKeyToken()).Replace("-","").ToLowerInvariant();
var expectedToken = "b77a5c561934e089";
Assert.AreEqual(expectedToken, token);
答案 1 :(得分:2)
如果所有程序集都已签名,您可以使用GetPublicKey()
或GetPublicKeyToken()
Assembly a =...
a.GetName().GetPublicKeyToken();
Assembly a =...
a.GetName().GetPublicKey();
并且比保留GUID列表更方便,也适用于将来的程序集。
答案 2 :(得分:2)
您可以通过检查强名称签名来完成此操作。有关如何操作,请参阅Checking For A Valid Strong Name Signature。请注意,该文章指的是使用带有StrongNameSignatureVerificationEx的P / invoke,但如果您使用的是.NET 4.0或更高版本,则应替换ICLRStrongName::StrongNameSignatureVerificationEx。
请参阅Public Keys and Public Key Tokens了解公钥令牌的实际内容。鉴于它只是公钥的哈希值,因此容易复制或提取,然后注入不可信的程序集,它不是验证程序集的安全机制。
答案 3 :(得分: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。