27

我目前正在考虑开源我的一个项目,并且正在准备要向公众发布的源代码和项目结构。现在我有一个问题:我应该如何处理我的程序集的签名密钥?我应该为开源版本创建一个新密钥并将其与其他文件一起发布到 SVN 存储库吗?我应该把密钥放在外面,每个想要编译代码的人都应该生成自己的密钥吗?

你怎么处理这个?我对向公众发布签名密钥感到有点不舒服。

4

3 回答 3

24

对于Protocol Buffers,我释放密钥。是的,这意味着人们实际上不能相信它是原始的二进制文件——但对于任何想要稍微修改代码、重建它并且仍然能够从另一个签名程序集中使用它的人来说,它让生活变得更加轻松。

如果有人真的想要一个协议缓冲区版本,他们可以相信它绝对是用 GitHub 的代码构建的合法版本,他们可以轻松地从他们信任的源代码自己构建它。

我当然可以从双方看到它。我想如果我正在编写一个围绕安全性的开源项目,那可能是另一回事。

于 2008-12-28T13:23:43.517 回答
19

不要松开钥匙。

您应该对向公众发布签名密钥感到不舒服。它不是项目的签名。这是你的签名。仅当您将密钥保密时,才能维护二进制文件签名的完整性。释放密钥颠覆了已签名程序集和强命名的含义和意图,从而引入了新的错误可能性,从而使每个系统的可靠性降低。不要松开钥匙

对于DotNetZip,我不释放密钥。但这里有一个关键点:关键不属于项目;这是我的钥匙。许多人要求提供密钥,以便他们可以重新构建签名的二进制文件,但这没有任何意义。我使用密钥签署的不仅仅是 DotNetZip。根据定义,使用该密钥签名的任何二进制文件都由我签名。使用我的密钥具有相同强名称的任何两个二进制文件都保证是相同的。释放密钥会消除这些保证,并破坏强名称的整个目的以及围绕它们的安全性。

想象一下开发人员选择他们自己的版本号,并用我的密钥重新签署修改后的二进制文件。现在世界将有 2 个具有相同强名称但内容不同的程序集。

想象一下,如果我能够使用您的密钥签署任何程序集。如果你释放了你的密钥,我可以添加我喜欢的任何代码——甚至是恶意代码——然后对其进行签名,然后偷偷地将你的任何“好的”签名二进制文件替换为“坏”的二进制文件。没有人能够分辨出其中的区别。

这已破了。自由共享密钥完全消除了使用签名程序集的任何优势。

如果人们想修改项目中的代码,然后在强名称程序集中重新使用修改后的版本,他们可以使用自己的密钥对修改后的版本进行签名。这并不难。

于 2009-05-20T03:34:45.880 回答
11

我不会公开发布密钥。拥有签名程序集的全部意义在于人们可以相信您是唯一接触二进制文件的人,因此如果添加了任何非法代码,则签名将被关闭,人们知道不信任该程序集。

签署程序集可以保护您免受其他人将“坏”代码添加到您的二进制文件并假装它是合法版本的影响。

于 2008-12-28T12:59:32.097 回答