假设我想发布一个开源类库。我想知道我是否应该用它发布 snk。例如,我确实想要一个 snk 来使 dll GAC 友好。我见过有公开 snk (NHibernate) 和未公开的项目 (DevExpress) 的大项目,以及双方的小项目,所以没有普遍的协议,这是肯定的。
假设我不发布私钥。这个库的用户本身就是开发人员,如果他们想要进行任何更改,要么需要重新编译我的源代码,要么对强名称验证进行例外处理。既是脖子痛,我也去过。
假设我发布它。我看不到如何利用它。CAS 和其他东西不再广泛使用,更重要的是,它甚至在 .NET 4.5 中已被弃用。所以这不像是可怜的用户根据它的公钥令牌授予我的程序集一些权利,而坏人用相同的令牌产生一个错误的程序集。如果一个坏人可以将他自己的 dll 放在某人的计算机上,那么阻止他们的并不是强大的名称。
我认为没有人会检查程序集的公钥令牌。当然,运行时会检查它自引用程序集编译后是否未更改,但仅此而已。发布者不发布他们的代币,所以据我所知,我可能会在编译我的代币时首先引用一个错误的程序集。
所以我倾向于发布snk。在我看来,它在理论上提供的安全性很小,在实践中没有安全性,所以为什么要让我的用户的生活更加艰难。也许我应该进行 X.509 代码签名(使用真正私钥的代码签名),但我认为大多数人也不会检查。
发表还是不发表?最好的论点获胜。理论方面,实践方面,MS™ 指南,都欢迎。