【问题标题】:Prevent people from reverse-engineering my network protocol防止人们对我的网络协议进行逆向工程
【发布时间】:2012-05-28 20:14:48
【问题描述】:

我知道我不能防止人们对我的协议进行逆向工程,但我想采取一种通过隐蔽性来确保安全的方法,以使其尽可能困难。

我有一个服务器/客户端系统,它通过网络使用http 样式的数据包进行通信。

例子:

Header
Attribute: Value
Attribute2: Other Value

Payload

我想让除我的客户以外的任何人访问网络变得尽可能困难。把他们反编译我的程序集的问题推到一边——我可以对这个网络规范做些什么好事情,这会使 非常困难 理解并在没有源代码的情况下进行另一个实现?

我在想某种奇怪的散列方法或某种很难的加密算法。

编辑我不想保护我的程序集或源代码。例如,我试图阻止某人使用 WireShark 或类似工具查看我的协议,然后根据该信息进行自己的实施。

【问题讨论】:

  • 使用一些加密怎么样?
  • @zerkms:建议已经在我的问题中
  • @caesay:为什么你认为使用一些可用的加密很困难,但发明一种新的加密很容易?
  • 通过默默无闻的安全性不存在。充其量您可以加密连接(ssl 等),但如果有些客户端应用程序的副本毫无意义。游戏厂商在这方面投入了多少?饼干需要多长时间才能闯入?
  • @AdamHouldsworth:我不是在谈论我的源代码。

标签: c# security networking obfuscation


【解决方案1】:

好的,三种情况:

  • 用户无法访问服务器代码,也无法访问客户端代码:最简单的方法是使用存储在二进制文件中的预先生成的共享密钥,并进行 aes 加密/解密。

  • 用户可以访问客户端或服务器代码,但不能同时访问两者:使用公钥/私钥方法。您可以使用公钥进行加密,但需要使用私钥进行解密。

  • 用户可以同时访问客户端和服务器代码:你完蛋了。

如果您想提高安全性,此静态密钥应仅在会话启动期间使用,以生成新的共享密钥,然后用于通信。

编辑:实际上,更简单、更安全的解决方案是使用 ssl 和证书(这是您不应该实现自己的加密的口头禅)每个证书都带有一个秘密私钥。只要用户无权访问,如果您验证对等方具有完全正确的证书,您就是安全的。

【讨论】:

  • 真的有客户端无法访问客户端代码的情况吗?
  • @Cicada:我也是这么问自己的。并不否定这是一个很好的答案。
  • @caesay 从来没有说过不是。
  • @Cicada 当然,如果你把它粘在你的黑盒硬件中。例如。任何当前的游戏机(当然,它们可以并且已经被破解)
【解决方案2】:

由于(来自 MMO)颠倒了一些网络协议,我可以告诉你,你将永远长期保护你的协议,对不起。

你能做的最好的就是:

  • 使用 custom 算法对其进行模糊处理(因为反转所需的时间比已知算法要长)。使用已知的加密方案无法提供任何保护。
  • 添加噪音。试着变得非常非常混乱。添加毫无意义的随机值。尝试对数据包使用动态布局。移动字段。发送无用的数据包。就像它是垃圾一样。
  • 版本你的协议,使两个连续的版本不兼容。这可能很难做到,但它迫使逆向者为每个后续版本重新做工作。

但这些只是减缓攻击者的方法。这肯定不会阻止他们。

【讨论】:

  • @Cicada 您认为找到密钥比对某些源代码进行逆向工程更容易。我更愿意相信安全专家的加密实现,而不是我自己的实现。
  • @Cicada 恐怕您的论点不过是一种假设。我会把系统的这一部分交给个人知道的人。
  • @Cicada 或者只是提取它并重新使用它,而无需实际重新实现它。从我无知的角度来看,六和二三。
  • @Adam:我认为您错过了这样一个事实,即加密不是为了传输安全,而是为了协议混淆。但是,您是对的,甚至不需要反转协议来破坏它,因为您可以提取原始例程来实现它。到目前为止,我同意这只是另一种情况,即默默无闻不会给你带来太多好处,但成本很高(实施和维护自定义协议)
  • 我很想看看您是如何在代码中创建一个如此晦涩难懂的算法,以至于有人无法对其进行逆向工程以查看它是如何在不成比例的时间内工作以使其不值得的。整个算法最终可以归结为一个代码文件。
【解决方案3】:

有三种解决方案:

  1. TLS。
  2. SSLv3。
  3. 无论你做什么。

1 和 2 已经工作了。

【讨论】:

    【解决方案4】:

    我也在用 C# 编写网络协议。我已经使用加密来保护协议。这是我如何做到这一点的支出,您可能会发现这很有用。

    • 一旦客户端连接,服务器会立即向客户端请求一个随机 UUID,客户端会使用服务器和客户端都知道的密码加密此 UUID。
    • 服务器或客户端此后发送的所有数据包都将使用该 UUID 作为密钥进行加密。

    关于“我在想某种奇怪的散列方法”,散列通常只用于数据验证。即确保它在发送给您的途中没有被修改。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多