.NET开源项目和强命名程序集?

qxsslcnc  于 2023-06-07  发布在  .NET
关注(0)|答案(4)|浏览(117)

我目前正在考虑开源我的一个项目,并且正在准备向公众发布的源代码和项目结构。现在我有一个问题我应该如何处理我的程序集的签名密钥?我是否应该为开源版本创建一个新的密钥,并将其与其他文件沿着发布到SVN存储库?我是否应该把密钥留在外面,让每个想编译代码的人都生成自己的密钥?
你怎么处理这个?我对向公众发布签名密钥感到有点不舒服。

yr9zkbsy

yr9zkbsy1#

对于Protocol Buffers,我释放密钥。是的,这意味着人们实际上不能相信它是原始的二进制文件--但它使任何想要修改代码、重建代码并仍然能够从另一个签名的程序集使用它的人的生活变得更加容易。
如果有人真的想要一个他们可以信任的协议缓冲区版本,并且绝对是用GitHub代码构建的合法版本,他们可以很容易地从他们信任的源代码中构建它。
但我可以从两个方面看到这一点。我想如果我写的是一个围绕 * 安全 * 的开源项目,那可能是另一回事。

kuhbmx9i

kuhbmx9i2#

别松开钥匙。
你应该感到不舒服释放一个签名密钥给公众。这不是项目的签名。这是你的签名只有当您对密钥保密时,二进制文件上签名的完整性才会得到维护。释放密钥会破坏已签名程序集和强命名的含义和意图,这会引入新的错误可能性,从而降低每个系统的可靠性。* 别松开钥匙 *
对于DotNetZip,我不释放密钥。但关键是密钥不属于项目;这是我钥匙很多人都要求密钥,这样他们就可以重新构建签名的二进制文件,但这毫无意义。我使用的密钥签名超过DotNetZip。根据定义,任何使用该密钥签名的二进制文件都是由我签名的。任何两个使用我的密钥具有相同强名称的二进制文件都保证是相同的。释放密钥将消除这些保证,并破坏强名称的全部目的及其周围的安全性。
想象一下,开发人员选择他们自己的版本号,并用我的密钥重新签名修改后的二进制文件。现在,世界上将有两个具有相同强名称但内容不同的程序集。
想象一下,如果我能够用你的密钥签署 * 任何 * 程序集。如果你释放了你的密钥,我就可以添加任何我喜欢的代码--甚至是恶意代码--然后对它进行签名,并偷偷地用一个“坏”的二进制文件替换你的任何“好”的签名二进制文件。没有人能分辨出其中的区别。
这个坏了自由共享密钥完全消除了使用已签名程序集的任何优势。
如果用户要修改项目中的代码,然后在强名称程序集中重用修改后的版本,则可以使用自己的密钥对修改后的版本进行签名。这并不难

muk1a3rh

muk1a3rh3#

我不会公开密钥。拥有一个签名的程序集的全部意义在于人们可以相信你是唯一一个接触二进制文件的人,所以如果有任何非法代码添加,那么签名就会关闭,人们知道不要信任程序集。
对程序集进行签名可以防止其他人向您的二进制文件中添加“错误”代码并假装它是合法的发行版。

kdfy810k

kdfy810k4#

一般来说,.Net在加载程序集时只关心公钥令牌,而不关心实际的密钥和签名(除了当涉及InternalsVisibleTo时,在这种情况下需要完整的公钥)。
虽然为了签署一个全新的程序集以拥有特定的公钥令牌(当然还有公钥),您将需要访问原始密钥,但是可以修改原始程序集的IL(直接或使用IL编织器,如FodydnSpy等工具),并且.Net将很乐意加载它。
事实上,IgnoresAccessChecksToGenerator工具似乎就是这样做的。
因此,我不认为保持它的私有性有多大价值,我确实看到许多流行的开源项目,如GitHub for Visual StudioLog 4 Net,实际上是保持它的公共性。
还要注意,Microsoft建议为开源项目签入.snk文件:
如果您是开放源代码开发人员,并且希望获得强名称程序集的标识优势以更好地与.NET Framework兼容,请考虑将与程序集关联的私钥签入源代码管理系统。
他们澄清:
警告
不要依赖强名称来保证安全性。它们仅提供唯一标识。

相关问题