using System;
using System.Linq;
using System.Reflection;
class Test
{
static void Main()
{
Console.WriteLine(IsMicrosoftType(typeof(string)));
Console.WriteLine(IsMicrosoftType(typeof(Test)));
}
static bool IsMicrosoftType(Type type)
{
object[] attrs = type.Assembly.GetCustomAttributes
(typeof(AssemblyCompanyAttribute), false);
return attrs.OfType<AssemblyCompanyAttribute>()
.Any(attr => attr.Company == "Microsoft Corporation");
}
}
当然,任何类型都可以声称是微软的,但是如果你只想在你自己的类型和框架上调用它,我想这应该能很好地工作。 或者,您可以使用程序集的公钥标记。这可能更难伪造。它依赖于Microsoft对其所有程序集使用公共公钥,而Microsoft并不使用公共公钥(根据Mehrdad在下面的评论)。然而,您可以轻松地将此解决方案用于一组可接受的“This is from Microsoft”公钥。也许可以将这两种方法结合起来,并报告任何差异以供进一步检查...
5条答案
按热度按时间xqnpmsa81#
第三方类型将从何而来?您可能希望区分声称由Microsoft提供的类型和不提供的类型。
当然,任何类型都可以声称是微软的,但是如果你只想在你自己的类型和框架上调用它,我想这应该能很好地工作。
或者,您可以使用程序集的公钥标记。这可能更难伪造。它依赖于Microsoft对其所有程序集使用公共公钥,而Microsoft并不使用公共公钥(根据Mehrdad在下面的评论)。然而,您可以轻松地将此解决方案用于一组可接受的“This is from Microsoft”公钥。也许可以将这两种方法结合起来,并报告任何差异以供进一步检查...
u7up0aaq2#
根据Jon的回答和Mehrdad的注解,似乎以下三个值用于.NET Framework提供的.NET 2.0和更高版本的程序集的公钥标记(来自AssemblyName.FullName):
公钥令牌=b77a5c561934e089
公钥令牌=b03f5f7f11d50a3a
公钥令牌=31bf3856ad364e35
这是从下列程式码产生的:
jecbmhm33#
类似于Mehrdad的答案,但即使代码在其他应用程序中执行,也允许进行相同的检查。
i7uq4tfw4#
检查型别是否已在目前组件中宣告。
guz6ccqo5#
下面是一个更现代的、大约2022年版本的Scott Dorman的解决方案,它给出了公钥令牌的最终列表:
}