使用强名称(存储在.snk文件中的密钥对)进行签名(以及其他用途)意味着protect against forging assemblies。
例如:我运送我的程序集用强名称签名,然后其他一些开发人员使用我的程序集,所以他的程序集现在包含对我的引用,提到我的密钥对的公钥。一些用户安装了开发人员程序集和我的程序集,并愉快地使用该开发人员的代码。如果其他人试图生成一个看起来像我的版本的程序集,并说服用户说这是一个“值得安装的更新”,那么伪装配将无法加载,因为我控制了我的密钥对,并且伪造的程序集没有使用相同的密钥对签名。好的,很酷。
但是什么阻止恶意方伪造我的程序集和其他开发人员的依赖程序集并“运送”它们?他们抓住我的组件和开发人员的组件,篡改两者,用任何键签署我的组件的伪造版本,然后在依赖组件的伪造版本中添加对它的引用,签名也然后发送它们。我的意思是恶意“运送”两个组件不应该比“装运”一个组件更难。
如何使用强名称进行签名可以防止伪造多个程序集?
答案 0 :(得分:5)
强烈命名程序集实际上并不意味着保护已签名的程序集。它是为了保护正在加载已签名组件的其他组件。
例如,如果EXE是受信任的并且想要从已知位置(例如GAC,网络共享,互联网等)加载已知DLL,则可以使用某个级别的强名称来加载它。相信大会没有被篡改。
但是,如果整个程序集被反汇编然后重新组装并重新签名,那么是的,你是对的,他们可以重新编写加载其余程序集的代码行,以便加载他们用新的(假)钥匙。
但这种篡改很明显。换句话说,强名称签名提供了明确的篡改证据,但并未在所有情况下都阻止它。除此之外,本地管理员可以完全禁用强名称验证(用于“开发”目的),很明显强名称签名不是防弹安全机制。
同样适用于Authenticode和驱动程序签名。我们都看到一个产品指示用户“忽略安全警告”。如果禁用强名称验证或者整个程序集的签名被剥离,那基本上就是EXE会做的事情 - 它会忽略警告。
答案 1 :(得分:0)
强大的命名就是这样,嗯...... “命名”。我在这里引用:Using Strong Name Signatures
“强名称提供了一种强大的机制,可以为.NET Framework程序集提供唯一的标识。”
这就是你从这个机制中获得的所有东西。这意味着我可以伪造你的组件和它所引用的所有组件,但我不能假装“你做了它”。我将无法假装你是这些程序集的发布者。