什么是程序集标识?

15

假设我只有一个默认的应用程序域。

显然,即使它们的路径不同,使用Assembly.LoadFrom()可能会导致加载相同名称、版本和内容的多个程序集。 这似乎与此处所说的相反:

“在绑定时,程序集显示名称的组件确定标识”。(http://blogs.msdn.com/b/suzcook/archive/2003/07/21/57232.aspx)

因为如果标识相同,为什么.NET会第二次将其加载到进程中呢?看来有两种不同的标识。

从那篇博客文章中,还有一些不合理的地方:

“并非所有组件在所有情况下都很重要。如果程序集没有强名称,则版本对于绑定是无关紧要的。但是,如果它被强命名,则程序集引用中的整个版本需要与找到的程序集匹配。”

这与这里所说的有何意义:

当启用此功能时,在加载程序集时不会验证强名称的正确性。默认值为true。(来自http://msdn.microsoft.com/en-us/library/cc679069(v=vs.90).aspx)
因此,根本不会验证强名称,这将使Suzanne在她的博客文章中所写的内容不正确。或者"验证"到底意味着什么?我认为所有这些都归结为对程序集标识的完全误解。我不明白程序集标识在何处、为什么以及如何在什么方面起作用。
1个回答

6
装配件身份认证速成课程:一个程序集有一个名称和版本,这很简单。程序集还有一种文化;不同文化的实现可能以不同的方式格式化日期字符串,尽管它们可能具有相同的名称和版本,但它们并不完全相同。公钥标记是弱安全措施的一部分,用于防止不同的发布者生成具有冲突身份的程序集。
为什么.NET会将程序集多次加载到同一个应用程序域中?
因为该程序集在不同的加载上下文中被加载。有一个对应于默认解析行为的上下文,一个上下文对应从文件路径加载的副本,以及一个上下文用于其他情况,例如从程序集解析器中的字节加载程序集时。此行为已经受到批评,因为来自具有相同身份但处于不同上下文中的程序集的类型被视为完全不同的类型。请参见此MSDN文章和此博客文章:

https://msdn.microsoft.com/en-ie/magazine/dd727509%28en-us%29.aspx#id0400031

http://www.pabich.eu/2009/07/how-many-times-can-you-load-assembly.html

苏珊·库克所说的验证是什么意思?作为一种安全机制(已被证明不够强大且容易被破解),有一个私有的强名称密钥和相应的公钥。公钥出现在DLL清单中。使用私钥对DLL进行签名,签名出现在PE文件中的某个位置 - PE头指向此信息。公钥的简短形式成为公钥标记。这确保只有持有私钥的发布者才能生成具有特定公钥标记的二进制文件,尽管这存在安全问题。此机制可防止不同发布者之间的程序集身份冲突。完全信任的程序集具有其他签名机制,可确保其真实性。作为优化,您可以绕过检查强名称签名,因为假定完全受信任的发布者不会尝试使程序集身份发生冲突。请参见此Microsoft文档以了解更多信息:

https://learn.microsoft.com/en-us/dotnet/framework/app-domains/how-to-disable-the-strong-name-bypass-feature

额外问题:我希望有一个强大的安全机制,让我的客户真正信任我的程序集。我甚至想验证我的应用程序组件是否由我发布,以防止反向工程、许可证避免等。我该如何做到这一点?

SHA256 Authenticode签名是最新和最优秀的签名PE文件的方法,无论它是托管程序集还是非托管二进制文件。这并不替代公钥令牌。公钥令牌对于建立程序集身份很重要。Authenticode签名对于验证程序集的真实性很重要。

https://blogs.msdn.microsoft.com/ieinternals/2011/03/22/everything-you-need-to-know-about-authenticode-code-signing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接