.NET程序集的强名称签名

时间:2015-08-13 13:08:42

标签: c# .net reverse-engineering

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

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

2 个答案:

答案 0 :(得分:4)

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

相反,你的程序集说"我想要一个名为X,版本Y的程序集,并且由公知的公钥Z"签名。系统然后找到名为X,版本Y的程序集,并声明由公钥Z签名并检查已通过私钥Z k 签署(与公钥Z)对应的私钥。 验证签名只需要公钥Z。

答案 1 :(得分:2)

公钥令牌不是存储在已签名程序集中的唯一信息。让我们看看命名的有效性如何:

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

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

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

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