16

给定一个强名称密钥(snk 文件)。将此文件添加到开源项目的源代码控制是否存在任何安全问题?

4

1 回答 1

19

简单的答案是肯定的和否定的——这取决于您首先对程序集进行强名称签名的目的。

强名称签名的 MSDN 页面很好地总结了这两个目的。

强命名为应用程序或组件提供了唯一标识,其他软件可以使用该标识明确引用它。例如,强命名使应用程序作者和管理员能够指定要用于共享组件的精确服务版本。这使得不同的应用程序可以指定不同的版本,而不会影响其他应用程序。此外,您可以使用组件的强名称作为安全证据来建立两个组件之间的信任关系。

任何公开分发的库 (DLL) 都应进行强名称签名,只要它旨在供最终用户使用。(即除非它是实现细节等。)

我所看到的签名的主要目的往往是出于更多技术原因,包括唯一标识(命名空间有时可能会无意中发生冲突)以及为 GAC 提供程序集。在这种情况下,公开密钥文件没有安全隐患,因为一开始就没有任何打算。不提供信任/来源保证,但唯一标识仍然有效。MSDN页面主要讨论这个场景;您应该和不应该签署集会的时间;和周围的细节。

但是,如果您签署程序集是为了进行身份验证——特别是为了向消费者提供程序集来自声明的来源的保证——那么公开的(公开分发的)密钥将完全使此信任模型无效。也就是说,任何人都可以任意修改您的项目代码,并正确地重建和退出您的程序集,实质上是伪造您的身份。不幸的是,MSDN 页面没有很好地解决这种用法(可能是因为它需要被更广泛地视为安全策略的一部分),但它仍然很重要。

最后,请注意,CLR/.NET 使用两种类型的密钥证书文件对程序集进行签名。正如您所提到的,第一个是 SNK;这是不受密码保护的。第二个是 PFX,它实际上只是 SNK 密钥文件的受密码保护的版本。只要此密码足够安全,使用您的开源软件分发安全 PFX 就不会出现安全问题。Visual Studio(和命令行密钥生成实用程序)当然能够创建两者。

于 2012-05-06T23:02:04.077 回答