【问题标题】:Signing a DLL assembly with public key token使用公钥令牌签署 DLL 程序集
【发布时间】:2015-05-26 11:48:40
【问题描述】:

我继承了一个 C# .NET 应用程序,该应用程序需要对其中一个 DLL 程序集中的一些路径名字符串进行轻微修改。很遗憾,我没有源代码。

我使用 ILSpy 和 Reflexil 插件进行了必要的修改。当我保存 DLL 时,我被告知原始文件已签名,如果没有签名,新文件将无法工作。新文件现在“延迟签名”。

我可以用 Reflexil 看到公钥、公钥令牌和哈希算法。

我对 .NET IL 完全陌生。如何使用我必须签署修补的 DLL 的公钥信息?

我有 Visual Studio 2013,所以可以访问 sn.exe,如果有帮助的话。

【问题讨论】:

  • 如果你能做到这一点,整个签名过程将毫无用处。唯一的方法是完全删除签名(这很可能会通过几个程序集传播)。您需要私钥才能正确签署程序集。
  • @Luaan 我可以从我的机器上创建一个私钥。这会有帮助吗,还是必须是原始私钥?
  • 这取决于你想要做什么。离开没有签名的程序集可能会很好。创建自己的密钥并用它签名可能会很好。但是在这两种情况下,您将拥有不同的程序集——任何引用它的程序集都必须重新编译(好吧,它们的引用必须改变)。签名是程序集身份的一部分——你不希望有人给你他们自己的 mscorlib,它会默默地替换你自己对 mscorlib 的引用,对吗?
  • @Luaan 好的,谢谢。如果我使用 Reflexil 删除强名称并使用其 AutoScan 组装工具来检测需要删除强名称的其他文件,它只会显示主应用程序。所以我想唯一要做的就是删除强名称并查看程序的行为。
  • 为什么这被否决了?更好的是,那个人应该说些什么。

标签: c# .net dll strongname assembly-signing


【解决方案1】:

正如 Luaan 上面所说,我想做的事情是不可能的。私钥就是这样 - 私人的。公钥用于验证目的,以确保程序集未被修改。

正如 Luaan 在他的一个 cmets 中所说,删除强名称是一种选择。然而,这对我不起作用,因为存在许多依赖项,使得该方法不切实际。

作为临时解决方案,我已将程序集文件延迟签名,并在相关 DLL 的注册表中禁用强名称验证。

要禁用强名称验证,请将此键添加到注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\<filename without extension>,<public key token>

对于 64 位系统,您还需要添加此密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\<filename without extension>,<public key token>

请注意,建议仅出于测试目的禁用强名称验证,因为这可能存在安全问题。

【讨论】:

  • 这行得通。哇。我将 EntityFramework 源代码添加到我的项目中,删除了对旧 EntityFramework.dll 的所有引用并添加了对项目的引用。每次运行代码的尝试都因签名错误而失败。然后我添加了 64 位系统的密钥,就像上面描述的那样,运行我的项目,就像魔术一样……我现在进入 EntityFramework 源代码。没有计算机重新启动或任何必要的。谢谢。
猜你喜欢
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多