什么是.snk文件?我知道它代表Strongly Named Key,但所有关于它是什么以及它是如何工作的解释都在我脑海中.
关于如何使用强名称密钥以及它如何工作,是否有任何简单的解释?
使用强名称(存储在.snk文件中的密钥对)进行签名(以及其他用途)旨在防止伪造组件.
例如:我运送我的程序集用强名称签名,然后其他一些开发人员使用我的程序集,所以他的程序集现在包含对我的引用,提到我的密钥对的公钥.一些用户安装了开发人员程序集和我的程序集,并愉快地使用该开发人员的代码.如果其他人试图生成一个看起来像我的版本的程序集,并说服用户说它是"值得安装的更新",那么伪装配将无法加载,因为我控制了我的密钥对,并且伪造的程序集没有使用相同的密钥对签名.好的,很酷.
但是什么阻止了恶意方伪造我的程序集和其他开发人员的依赖程序集并"运送"它们两者?他们抓住我的组件和开发人员的组件,篡改两者,用任何键签署我的组件的伪造版本,然后在依赖组件的伪造版本中添加对它的引用,签名也然后发送它们.我的意思是恶意"运输"两个组件不应该比"装运"一个组件更难.
如何使用强名称进行签名可以防止伪造多个程序集?
我时不时地在网络上看到一个示例项目,其中包含一个 .snk 文件,用于使用强名称对编译结果进行签名。
AFAIK这是完全错误的- 一旦 .snk 文件被披露,任何人都可以生成一个程序集,该程序集可用于替换原始代码供应商提供的程序集,但现在包含恶意代码。我想传送 .snk 文件的人不会认真对待这种风险而只是传送文件,否则项目将无法编译现成的。
除了“方便”之外,是否有任何理由发送 .snk 文件?
假设我有多个 .NET 程序集,并希望使用强名称对每个程序集进行签名。一个密钥对(一个 .snk 文件)是否足够,还是我需要为每个程序集生成一对?我是否必须发布(每个)密钥对的公钥?