检查总成的身份?可能是因为它的强势名字

本文关键字:是因为 身份 检查 | 更新日期: 2023-09-27 18:03:54

在我的一个应用程序中,我必须区分我自己的插件和别人的插件。
它们每个都用不同的密钥签名,主机应用程序也是如此。

有什么办法来区分我的程序集和别人的程序集吗?(可能需要签名密钥的帮助)

检查总成的身份?可能是因为它的强势名字

可以根据存储在容器程序集中的列表检查已加载的程序集公钥令牌。

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));

你也可以检查token,使用GetPublicKeyToken和BitConverter

var assembly = typeof(string).Assembly;
var token = BitConverter.ToString(assembly.GetName().GetPublicKeyToken()).Replace("-","").ToLowerInvariant();
var expectedToken = "b77a5c561934e089";
Assert.AreEqual(expectedToken, token);

如果你所有的程序集都有符号,你可以使用GetPublicKey()GetPublicKeyToken()

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

将比保持GUID列表更方便,并且也可以用于未来的程序集。

您可以通过检查强名称签名来实现这一点。有关如何做到这一点,请参阅检查有效的强名称签名。请注意,本文提到使用P/invoke与StrongNameSignatureVerificationEx,但如果您使用。net 4.0或更高版本,您应该替换ICLRStrongName::StrongNameSignatureVerificationEx。

参见公钥和公钥令牌了解公钥令牌的实际含义。鉴于它只是公钥的散列,因此很容易复制或提取,然后注入到不受信任的程序集,因此它不是验证程序集的安全机制。

一小段漂亮的代码:

// 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。