检查总成的身份?可能是因为它的强势名字
本文关键字:是因为 身份 检查 | 更新日期: 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();
和
您可以通过检查强名称签名来实现这一点。有关如何做到这一点,请参阅检查有效的强名称签名。请注意,本文提到使用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。