使用公钥标记对DLL程序集进行签名

时间:2015-05-26 11:48:40

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

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

我使用ILSpy和Reflexil插件进行了必要的修改。当我保存DLL时,我告诉原始文件已签名,新文件在没有签名的情况下无法正常工作。新文件现在"延迟签名"。

我可以看到公钥,公钥令牌和带Reflexil的哈希算法。

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

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

1 个答案:

答案 0 :(得分:3)

正如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>

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