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

C# 使用公钥令牌对DLL程序集进行签名,c#,.net,dll,strongname,assembly-signing,C#,.net,Dll,Strongname,Assembly Signing,我继承了一个C#.NET应用程序,它需要对其中一个DLL程序集中的一些路径名字符串进行轻微修改。很遗憾,我没有源代码 我使用ILSpy和Reflexil插件进行了必要的修改。当我保存DLL时,我被告知原始文件已签名,新文件在未签名的情况下无法工作。新文件现在是“延迟签名” 我可以看到公钥、公钥令牌和带有reflecil的哈希算法 我对.NET IL完全陌生。如何使用必须的公钥信息对修补的DLL进行签名 我有Visual Studio 2013,所以可以访问sn.exe,如果这有帮助的话。正如Lu

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

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

我可以看到公钥、公钥令牌和带有reflecil的哈希算法

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


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

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

正如Luaan在其评论中所说,删除强名称是一种选择。但是,这对我来说不起作用,因为有很多依赖项,使得该方法不切实际

作为一个临时解决方案,我对程序集文件进行了延迟签名,并在相关DLL的注册表中禁用了强名称验证

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\<filename without extension>,<public key token>
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\StrongName\Verification\,
对于64位系统,还需要添加此密钥:

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

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

如果可以这样做,整个签名过程将完全无用。唯一的方法是完全删除签名(这可能会通过几个程序集传播)。您需要私钥才能对程序集进行正确签名。@Luaan我可以从我的计算机创建私钥。这会有帮助吗?还是必须是原始私钥?这取决于您尝试执行的操作。在没有签名的情况下离开程序集可能没什么问题。您可以创建自己的密钥并用它签名。但在这两种情况下,您将拥有一个不同的程序集-引用它的任何程序集都必须重新编译(好的,它们的引用必须更改)。签名是程序集身份的一部分-你不会希望有人给你自己的mscorlib,这样会悄悄地取代你自己对mscorlib的引用,是吗?@Luaan好的,谢谢。如果我用reflecil删除强名称,并使用其AutoScan汇编工具检测其他哪些文件需要删除强名称,那么它只会显示主应用程序。所以我想唯一要做的就是删除强名称,看看程序如何运行。为什么会被否决?更好的是,那个人应该说些什么。这是有效的。哇!我将EntityFramework源代码添加到项目中,删除了对旧EntityFramework.dll的所有引用,并添加了对项目的引用。每次尝试运行代码都失败,并出现签名错误。然后我添加了64位系统的密钥,就像上面描述的一样,运行我的项目,就像魔术一样。。。我现在进入EntityFramework源代码。没有计算机重启或任何必要的操作。非常感谢。