要对程序集 A 签名,您必须确保 A 使用的所有程序集 B、C、D 都已签名,然后是 B、C、D 等使用的所有程序集。我不明白这有什么安全好处。我认为它应该防止篡改,但是程序集A允许打开任何文件,并且这些文件可以被篡改。外部网络服务器也是如此。
此外,使用您公开的 .snk 文件对程序集进行签名太容易了,从而回避了要求。
要对程序集 A 签名,您必须确保 A 使用的所有程序集 B、C、D 都已签名,然后是 B、C、D 等使用的所有程序集。我不明白这有什么安全好处。我认为它应该防止篡改,但是程序集A允许打开任何文件,并且这些文件可以被篡改。外部网络服务器也是如此。
此外,使用您公开的 .snk 文件对程序集进行签名太容易了,从而回避了要求。
关键是,否则您可以将程序集 B/C/D 替换为不同的(被黑客入侵的)程序集,而 A 永远不会注意到;它会加载它们并执行代码。使用强命名,如果不使用相同的密钥重新签署被黑的 B/C/D,或者黑掉 A,就无法做到这一点。
强命名的另一个原因是版本控制。如果你引用一个强命名的程序集,你会得到那个特定的版本——它会在它所依赖的特定版本上加载它的依赖项。
编辑
示例场景:如果您将程序集放在 GAC 中,它必须是强命名的以允许并行版本控制。但是,您不能将它放在 GAC 中,除非它的依赖项也在那里(否则,它们将无法在运行时加载)。为了可靠地加载这些程序集,它们也需要在 GAC 中进行强命名。
这是因为强命名程序集意味着它可以被信任,并且授予的安全级别基于代码来自合法来源的想法。这意味着它与之交互的所有其他项目也必须是可信的,因为它在相同的安全上下文下执行。
如果强命名对象不能以这种方式工作,一种攻击方法是用攻击者想要执行的恶意代码替换未签名的项目。恶意代码将在签名项目的可信安全上下文下执行。