Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查总成';谁的身份?可能是因为它';谁的名字好?_C#_.net_Assemblies_Strongname - Fatal编程技术网

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的所有使用,包括可能通过加载的任何加载项