为什么强名称程序集不能使用未签名的程序集?

时间:2009-05-15 13:51:10

标签: .net assemblies code-signing

要对程序集A进行签名,您必须确保A使用的所有程序集B,C,D都已签名,然后确保B,C,D等使用的所有程序集。我不明白这有什么安全上的好处。我认为它应该防止篡改,但是允许程序集A打开任何文件,这些文件可能被篡改。外部网络服务器也是如此。

此外,使用您公开的.snk文件对程序集进行签名太容易了,从而回避了这一要求。

3 个答案:

答案 0 :(得分:8)

关键在于,否则你可以用不同的(黑客)替换B / C / D组装,A永远不会注意到;它会加载它们并执行代码。如果没有使用相同的密钥重新签名被黑客入侵的B / C / D,或者通过黑客攻击A,您就无法做到这一点。

答案 1 :(得分:2)

强命名的另一个原因是版本控制。如果您引用一个强大的命名程序集,那么您将获得该特定版本 - 它将在其依赖的特定版本中加载其依赖项。

修改

示例场景:如果您将程序集放在GAC中,则必须将其强名称以允许并行版本控制。但是,你不能把它放在GAC中,除非它的依赖性也存在(否则,它们无法在运行时加载)。为了能够可靠地加载这些程序集,它们也需要强大的命名,并且在GAC中。

答案 2 :(得分:1)

这是因为强名称程序集意味着它可以被信任,并且授予安全级别基于代码来自合法来源的想法。这意味着它与之交互的所有其他项也必须是受信任的,因为它在相同的安全上下文下执行。

如果强命名对象不能以这种方式工作,则攻击方法是用攻击者想要执行的恶意代码替换未签名的项目。流氓代码将在签名项的可信安全上下文下执行。