延迟签名和.net中的强名称到底是什么?

本文关键字:强名称 是什么 net 延迟 | 更新日期: 2023-09-27 18:16:57

我在很多文章中看到这样写程序集的延迟签名和强名称可防止程序集被劫持。

那是什么意思?

我所知道的唯一一件事是,没有一个强名称,你不能在GAC中安装程序集。假设我有一个没有强名称的集合,它可以被劫持吗?

谁来解释一下我的疑问

延迟签名和.net中的强名称到底是什么?

MSDN上有很多关于这方面的信息;例如:强命名和延迟签名

总结一下基本思想:

强命名是一种用简单的识别标记标记程序集的方法,以后可以使用该标记来验证程序集自部署以来没有被修改过。强名称基本上是程序集名称、版本和开发人员唯一的"强名称密钥"的散列。对强名称程序集的引用比对非强名称程序集的引用要经过更严格的验证;特别是,强名称引用必须匹配版本号,强名称散列必须匹配。

这有助于避免程序中两个常见的潜在安全漏洞来源:

  1. 恶意用户将程序中的程序集替换为具有相同文件名但包含恶意代码的不同程序集,并说服程序加载并执行它。
  2. 恶意用户用同一程序集的不同版本替换程序集,但该程序集已经修复了已知的错误。

强名称进程将拒绝这两个操作,因为强名称数据将不匹配。这就是为什么GAC中的程序集必须是强命名的原因:它们的用途如此普遍,否则它们将成为这种劫持的主要目标。

但是,请注意,强名称绝对不会验证发布者的身份。任何人都可以发布一个强命名程序集,声称自己是Microsoft,并且在强命名中没有任何东西可以反驳这种说法。验证身份是Authenticode数字签名的工作,它不同于强命名。这两者经常一起使用,但它们是正交的概念。

延迟签名是一种在构建过程之外签名程序集的技术。这里的想法是,您的公司可能有一些策略,不允许在构建时使用强名称密钥(可能将它们保持离线状态,或者使用密码保护它们)。延迟签名程序集用空白强名称密钥标记:它基本上为授权用户稍后添加的密钥保留空间。与此同时,还包含了部分强名称键——仅够其他程序集生成强引用的信息,但不足以检测更改或修改。