C# 检查总成';谁的身份?可能是因为它';谁的名字好?
在我的一个应用程序中,我必须将自己包含的外接程序与其他外接程序区分开来。C# 检查总成';谁的身份?可能是因为它';谁的名字好?,c#,.net,assemblies,strongname,C#,.net,Assemblies,Strongname,在我的一个应用程序中,我必须将自己包含的外接程序与其他外接程序区分开来。 它们分别使用不同的密钥签名,主机应用程序也是如此 是否有任何方法可以将我的程序集与其他程序集区分开来?(可能借助于签名密钥)您可以根据存储在容器程序集中的列表检查加载的程序集公钥令牌 或者只需存储程序集的全名,如下所示: var assembly = typeof (string).Assembly; var myAssemblies = new HashSet<string> { "mscorlib,
它们分别使用不同的密钥签名,主机应用程序也是如此
是否有任何方法可以将我的程序集与其他程序集区分开来?(可能借助于签名密钥)您可以根据存储在容器程序集中的列表检查加载的程序集公钥令牌 或者只需存储程序集的全名,如下所示:
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));
您可以对照存储在容器程序集中的列表检查加载的程序集公钥令牌 或者只需存储程序集的全名,如下所示:
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));
一个小片段:
// 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也是如此。一个很好的片段:
// 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。如果所有程序集都已签名,则可以使用
GetPublicKey()
或GetPublicKeyToken()
并且将比保留GUID列表更方便,并且也适用于将来的程序集。如果您的所有程序集都已签名,则可以使用
GetPublicKey()
或GetPublicKeyToken()
而且比保留GUID列表更方便,并且也适用于将来的程序集。您可以通过检查强名称签名来实现这一点。请参阅以了解如何执行此操作。请注意,本文提到将P/invoke与strongNameSignatureReferationEx一起使用,但如果您使用的是.NET 4.0或更高版本,则应替换为
请参阅,了解公钥令牌实际上是什么。由于它只是公钥的散列,因此很容易复制或提取,然后注入到不受信任的程序集中,因此它不是验证程序集的安全机制。您可以通过检查强名称签名来实现这一点。请参阅以了解如何执行此操作。请注意,本文提到将P/invoke与strongNameSignatureReferationEx一起使用,但如果您使用的是.NET 4.0或更高版本,则应替换为
请参阅,了解公钥令牌实际上是什么。考虑到它只是公钥的散列,因此很容易复制或提取,然后注入到不受信任的程序集中,它不是验证程序集的安全机制。Ok,因此我获取加载项的GUID,并根据自己的列表进行检查。但是,是什么阻止另一个加载项使用我自己的guid呢?@Vercas,没什么。没有预防机制。这都是“做一个好公民”。让我们看看。。。你不是说你的申请已经签字了吗?如果是,为什么不检查密钥签名呢?最后,您还可以对所有程序集的一部分进行哈希(MD5、CRC等)并将其与您自己的程序集进行比较。您需要密钥文件对程序集进行签名,这(希望)是您保密的。好的,因此我获取了加载项的GUID,并根据我自己的列表进行检查。但是,是什么阻止另一个加载项使用我自己的guid呢?@Vercas,没什么。没有预防机制。这都是“做一个好公民”。让我们看看。。。你不是说你的申请已经签字了吗?如果是,为什么不检查密钥签名呢?最后,您还可以对所有程序集的一部分进行哈希(MD5、CRC等)并将其与您自己的程序集进行比较。您需要密钥文件对程序集进行签名,而这(希望)是由您保密的。我很好奇,其他人不能以某种方式使用相同的公钥创建程序集吗?如果他们有密钥文件,这就是为什么它通常作为一个安全资产进行管理。可以任意地将程序集的公钥令牌更改为您喜欢的内容。如果您只是检查PublicKeyToken,您将无法检测到伪密钥。@freedompeace:可以以忽略验证跳过的方式验证强名称签名的有效性,从而可以加载具有此类“伪”签名的程序集。请稍候。。。因此有可能破坏/伪造签名。那么他们的目的是什么?我很好奇,其他人不能用相同的公钥创建程序集吗?如果他们有密钥文件,这就是为什么它通常作为安全资产进行管理的原因。可以任意将程序集的公钥标记更改为您喜欢的内容。如果您只是检查PublicKeyToken,您将无法检测到伪密钥。@freedompeace:可以以忽略验证跳过的方式验证强名称签名的有效性,从而可以加载具有此类“伪”签名的程序集。请稍候。。。因此有可能破坏/伪造签名。那么它们的目的是什么?在这种情况下,将您的程序集与其他程序集区分开来的目的是什么?i、 e:您的应用程序以何种方式对待您的程序集与其他程序集不同?因为我的应用程序使用的库仅授权给我。插件开发人员没有许可证,如果他们有,我会让他们与我联系。如果你的应用程序有运行时许可证,为什么你需要监控插件?如果库开发人员希望施加设计时许可限制,那么这些限制可能会在设计时应用于插件开发人员,但您不应该在运行时执行任何其他检查。从逻辑上考虑这一点。我的应用程序
A
使用库L
,开发人员制作了这个插件D
。加载项应该使用A
,它使用L
。所以,D
间接地使用了L
!(A
->L
&D
->A
=>D
->L
)当然可以,但如果您已经有许可证可以在运行时覆盖A对L的使用,则此许可证可能覆盖A内对L的所有使用,包括可能通过加载的任何加载项