给出一个强名称密钥(snk文件)。将此文件添加到开源项目的源代码管理中是否存在任何安全问题?
答案 0 :(得分:14)
简单的答案是肯定的,不是 - 这取决于你首先对名称进行强名称的目的。
Strong-Name Signing上的MSDN页面很好地总结了这两个目的。
强命名为应用程序或组件提供了唯一的标识 其他软件可以用来明确地引用它。例如, 强命名使应用程序作者和管理员能够 指定要用于共享组件的精确服务版本。 这使不同的应用程序可以指定不同的版本 不影响其他应用程序。另外,你可以使用 作为建立信任的安全证据的组件的强名称 两个组成部分之间的关系。
任何公开分发的库(DLL)都应该是强名称签名的,只要它打算由最终用户使用即可。 (即除非是实施细节等。)
我所看到的签名的主要目的往往是出于更多技术原因,包括唯一标识(名称空间有时可能会无意中发生冲突)以及为GAC提供程序集。在这种情况下,公开提供密钥文件不会产生任何安全隐患,因为首先没有任何意图。不提供信任/来源保证,但唯一标识仍然有效。 MSDN页面主要讨论这种情况;你应该而且不应该签署集会的时候;和周围的细节。
但是,如果您为了身份验证而签署程序集 - 特别是为了向消费者提供程序集来自声明的源代码的保证 - 那么完全是一个开放的(公开分布的)密钥使此信任模型无效。也就是说,任何人都可以随意修改您的项目代码,并正确地重建和重新组装您的程序集,从根本上伪造您的身份。不幸的是,MSDN页面并没有很好地解决这个问题(可能因为它需要被更广泛地考虑作为安全策略的一部分),但它仍然很重要。
最后,请注意CLR / .NET使用两种类型的密钥证书文件来签署程序集。首先是SNK,如你所说;这是非密码保护的。第二个是PFX,它实际上只是SNK密钥文件的密码保护版本。只要此密码足够安全,因此在使用您的开源软件分发安全的PFX时就没有安全问题。 Visual Studio(以及命令行密钥生成实用程序)当然能够创建两者。