【问题标题】:Strong name signing of .NET assemblies.NET 程序集的强名称签名
【发布时间】:2015-11-06 11:26:35
【问题描述】:

为什么我不能创建一个新程序集并使用与前一个相同的公钥对其进行签名以恶意替换它?它必须起作用,因为有关当前程序集中使用的外部程序集的唯一信息是它们的公钥令牌、物理名称和版本。没有数字签名。

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}

【问题讨论】:

    标签: c# .net reverse-engineering


    【解决方案1】:

    如果引用包含实际签名,那么您所引用的程序集将永远不会以任何方式更新。

    相反,您的程序集说“我想要一个名称为 X、版本 Y 并由众所周知的公钥 Z 签名的程序集”。然后系统找到一个名为 X、版本 Y 并声称由公钥 Z 签名的程序集,并检查它是否由私钥 Zk 签名(与公钥 Z 对应的私钥)。 验证签名只需要公钥 Z。

    【讨论】:

    • 私钥和公钥在数学上是相关的,我可以使用与我的公钥不矛盾的任何私钥来签署程序集。然后我可能会生成一个签名,这个签名将是有效的。
    • @Ilia - 如果你相信你有一种技术可以获取给定的公钥(令牌)并生成与之配合使用的私钥,请与全世界分享 - 这将是新闻。
    • @Ilia - 例如采取RSA。公钥是一个指数,e模数n。创建另一个使用指数e 的私钥/公钥对很简单。创建另一个共享指数e 和模数n 的私钥/公钥对并非简单。
    • @Ilia 它们是“数学连接”的事实并不意味着仅通过知道公钥来找出私钥是微不足道的。像这样的非对称密码可以很容易地从私钥中获取公钥,并在只有公钥的情况下验证使用私钥所做的签名,但是从公钥中获取私钥需要大量工作。量子计算机有朝一日可能会改变这一点,但我们已经拥有了即使在这种情况下也是安全的非对称密码——我们“只是”必须转换。
    • Damien,您应该明确说明验证程序集的人不需要私钥。任何了解非对称密码的人都会知道,但其他人可能会感到困惑。
    【解决方案2】:

    公钥令牌不是存储在签名程序集中的唯一信息。简而言之,让我们看看强命名是如何工作的:

    • 您照常创建公私密钥对
    • 程序集照常编译
    • 计算程序集的哈希,并使用私钥签名。此值存储在签名程序集中。
    • 该对的公钥也存储在程序集中

    非对称部分是关键点-当运行时在加载时计算程序集的哈希时,它可以使用只是公钥比较签名-但实际上是创建 em> 签名,你需要 private 密钥。

    安全性主要取决于从您手头的信息中找到私钥的复杂性,以及仅从哈希和公钥猜测正确签名的可能性。在具有相当大密钥的经典计算机上,这将需要很长时间。

    因此,您信任公钥,因为您知道与之关联的开发人员。而且您知道给定程序集确实是由该开发人员生成的,因为您可以根据密钥验证程序集的实际二进制数据,以确保它只能由拥有与给定公钥关联的私钥的人签名。这也使修改变得安全 - 如果您在程序集中进行更改,您还需要更改哈希签名,并且您需要私钥来执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多