.net - 发布 .net 强名称私钥的影响?

标签 .net security strongname

假设我想发布一个开源类库。我想知道我是否应该与它一起发布 snk。例如,我确实想要一个 snk 来使 dll GAC 友好。我见过带有公共(public) snk (NHibernate) 和非公开 snk (DevExpress) 的大型项目,也见过双方的小型项目,所以没有达成普遍共识,这是肯定的。

假设我不发布私钥。该库的用户本身就是开发人员,如果他们想要进行任何更改,则需要重新编译我的源代码,或者对强名称验证进行异常(exception)处理。脖子都痛,我也经历过。

假设我发布了它。我不明白如何利用这一点。 CAS 之类的东西不再被广泛使用,更重要的是,它甚至在 .NET 4.5 中被弃用。因此,这并不像贫穷的用户根据其公钥 token 向我的程序集授予一些权限,而坏人则使用相同的 token 生成一个错误的程序集。如果坏人可以将自己的 dll 放到某人的计算机上,那么强名称确实无法阻止他们。

我认为没有人检查过程序集的公钥标记。当然,运行时会检查自编译引用程序集以来它是否没有更改,但仅此而已。发布者不会发布他们的 token ,因此据我所知,当我编译我的 token 时,我可能首先会引用错误的程序集。

所以我倾向于发布 snk。在我看来,它在理论上几乎没有提供安全性,在实践中也没有提供任何安全性,所以为什么要让我的用户的生活变得更加困难呢。也许我应该进行 X.509 代码签名(即具有真正私密的私钥的签名),但我认为大多数人也不会检查这一点。

发表还是不发表?最好的论点获胜。理论方面、实践方面、MS™ 指南,都欢迎。

最佳答案

我不会发布它。

它将允许攻击者重新编译程序集,并向其中添加恶意代码。更改后的程序集将具有与您的程序集相同的强名称。

如果您不发布 key ,则可以在没有 key 的情况下分发库的“受信任”二进制文件和源代码。如果第 3 方开发人员需要自定义该库,他们只需要为其生成一个新 key (但生成的程序集将具有与官方版本不同的强名称,从而允许运行时区分两者)。

关于.net - 发布 .net 强名称私钥的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787051/

相关文章:

c# - 无法将程序集安装到缓存?

.net - 是否可以用使用不同 key 签名的程序集来替换强名称程序集?

c# - .snk 文件的位置及其管理

c# - MSTest:CollectionAssert.AreEquivalent 失败。预期的集合包含 1 次出现

.net - 如何将 IQueryable<Something> 作为 IQueryable<ISomething> 返回

c# - 如何获取通过网络共享身份验证的用户的用户名

node.js - 安装(运行)国外 npm 模块有哪些风险?我们可以限制风险吗?

php - MySQL 数据库中加密数据的通配符搜索?

c# - 在 .NET 中获取文件类型

c# - 从 XML 文档生成 LINQ to XML C# 代码?