使用程序集StrongName提供的保护?

时间:2013-09-24 18:40:20

标签: c# .net-assembly strongname

我认为StrongName不会阻止反射 - 这是混淆器的工作。但除了创建相当独特的名称之外,使用StrongNames的加密目的或保护是什么?

假设

  1. MyAssemblyinternal个类和方法,通过它们公开  [assembly: InternalsVisibleTo("MyAssemblyTest, PublicKey=RealRSAPublicKey")]

  2. MyAssemblyTest,测试装配。

  3. 这些程序集都有StrongNames,可能使用相同的RSA密钥对。

    什么阻止某人

    1. 剥离MyAssembly
    2. 上的签名
    3. 创建假/伪RSA密钥对
    4. 将装配属性修改为[assembly: InternalsVisibleTo("MyAssemblyTest, PublicKey=FakeRSAPublicKey")]
    5. 使用自己的假/伪RSA密钥对重新签名MyAssembly
    6. 在自己的程序集中使用内部,请说MaliciousAssembly
    7. 我想我不清楚Strongnaming的真正职责是什么......会欣赏一些见解。

1 个答案:

答案 0 :(得分:0)

为程序集提供强名称的主要目的是防止使用程序集的其他人的代码的恶意用户用自己的代码替换代码。

请考虑这种情况:您将一个TransmitSecret.dll程序集提供给客户,以便他们能够以安全的方式与您的服务器进行通信。如果TransmitSecret.dll未签名,恶意用户将能够编写自己的模块,该模块提供与您相同的界面,将您的代码包装在他们自己的恶意代码中,拦截客户的所有“安全”传输,并发送复制到自己的服务器。只需将dll替换为他们的TransmitSecret.dll,他们就可以无需访问客户的源代码即可完成此操作。

但是,如果TransmitSecret.dll已签名,并且您的客户代码与其相关联,那么交换程序集的技巧就不会起作用:当客户的代码尝试加载{{1}}时, .NET会注意到这一变化,并阻止程序启动。