4

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

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

例子:

Header
Attribute: Value
Attribute2: Other Value

Payload

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

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

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

4

4 回答 4

7

好的,三种情况:

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

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

  • 用户可以访问客户端和服务器代码:你搞砸了。

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

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

于 2012-05-28T20:20:55.830 回答
6

由于已经反转了一些网络协议(来自 MMO),我可以告诉你,你永远不会保护你的协议很长时间,我很抱歉。

你能做的最好的事情是:

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

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

于 2012-05-28T20:22:43.580 回答
2

有三种解决方案:

  1. TLS。
  2. SSLv3。
  3. 不管你煮什么。

1和2已经工作了。

于 2012-05-30T00:05:52.257 回答
0

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

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

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

希望这可以帮助。

于 2012-05-28T20:26:46.063 回答