使用公钥令牌对DLL程序集进行签名

3
我接手了一个C# .NET应用程序,需要对其中一个DLL组件中的一些路径名字符串进行轻微修改。不幸的是,我没有源代码。
我使用ILSpy和Reflexil插件进行必要的修改。当我保存DLL时,提示原始文件已签名,新文件未签名不能工作。新文件现在是“延迟签名”的。
我可以使用Reflexil看到公钥、公钥令牌和哈希算法。
我完全不懂.NET IL。如何使用我拥有的公钥信息对修补后的DLL进行签名?
我有Visual Studio 2013,因此可以访问sn.exe,如果有帮助的话。

7
如果你这样做,整个签名过程将完全无用。唯一的方法是完全移除签名(可能需要在多个程序集中传递)。您需要私钥才能正确签名程序集。 - Luaan
@Luaan 我可以从我的机器上创建一个私钥。这有帮助吗,还是必须使用原始的私钥? - Hugh McMaster
1
这取决于你想做什么。不签名可能没问题。也可以创建自己的密钥并进行签名。但在这两种情况下,你将拥有一个不同的程序集 - 引用它的任何程序集都必须重新编译(引用也必须更改)。签名是程序集身份的一部分 - 你不希望有人给你他们自己的mscorlib,会悄悄地替换你对mscorlib的引用,对吧? - Luaan
@Luaan 好的,谢谢。如果我使用 Reflexil 删除强名称并使用其 AutoScan 程序集工具来检测需要删除强名称的其他文件,它只会显示主应用程序。所以我想唯一要做的就是删除强名称并查看程序的行为如何。 - Hugh McMaster
3
为什么这个被踩了?更好的办法是,那个人应该说点什么。 - Hugh McMaster
1个回答

4
如Luaan所说,我想做的事情是不可能的。私钥就是私人的。公钥是为了验证目的而设计的,以确保程序集没有被修改。
移除强名称是一种选择,正如Luaan在评论中所说。然而,对我来说这并不起作用,因为有许多依赖项,使该方法变得不切实际。
作为临时解决方案,我将程序集文件保留为延迟签名,并在注册表中禁用了相关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>

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

1
这个方法奏效了,哇!我将EntityFramework源代码添加到我的项目中,删除了所有对旧的EntityFramework.dll的引用,并改为引用该项目。每次尝试运行代码都会出现签名错误。然后,我按照上面所述的方式添加了64位系统的密钥,运行了我的项目,就像魔术一样……我现在可以进入EntityFramework源代码了。无需重新启动计算机或其他任何操作。谢谢! - Triynko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接