1

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

认为

  1. MyAssembly有类和方法,internal它们通过 [assembly: InternalsVisibleTo("MyAssemblyTest, PublicKey=RealRSAPublicKey")]

  2. MyAssemblyTest,测试组件。

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

是什么阻止了某人

  1. 剥离签名MyAssembly
  2. 创建假/伪 RSA 密钥对
  3. 将程序集属性修改为[assembly: InternalsVisibleTo("MyAssemblyTest, PublicKey=FakeRSAPublicKey")]
  4. MyAssembly使用他们自己的假/伪 RSA 密钥对重新签名
  5. 例如,在他们自己的组件中消耗内部组件MaliciousAssembly

我想我不清楚 Strongnaming 的真正职责是什么……希望能得到一些见解。

4

1 回答 1

0

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

考虑一下这种情况:您制作了一个TransmitSecret.dll组件并提供给您的客户,以便他们可以以安全的方式与您的服务器通信。如果TransmitSecret.dll没有签名,恶意用户将能够编写他们自己的模块,提供与您相同的界面,将您的代码包装在他们自己的恶意代码中,拦截您客户的所有“安全”传输,并将副本发送给他们自己的服务器。他们将能够做到这一点,而无需访问您客户的源代码,只需将您替换dll为他们的源代码即可。

但是,如果TransmitSecret.dll已签名,并且您的客户代码链接到它,则交换程序集的技巧将不起作用:当您的客户代码尝试加载TransmitSecret.dll时,.NET 会注意到更改,并阻止程序启动向上。

于 2013-09-24T18:49:44.453 回答