防止人们对我的网络协议进行逆向工程

时间:2012-05-28 20:14:48

标签: c# security networking obfuscation

我知道我不能阻止人们对我的协议进行逆向工程,但是我想采取一种安全透明的方法来尽可能地让它变得更加困难。

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

示例:

Header
Attribute: Value
Attribute2: Other Value

Payload

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

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

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

4 个答案:

答案 0 :(得分:7)

好吧,有三种情况:

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

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

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

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

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

答案 1 :(得分:6)

为了改变一些网络协议(来自MMO),我可以告诉你,你永远不会保护你的协议很长时间,对不起。

你能做的最好的事情是:

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

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

答案 2 :(得分:2)

有三种解决方案:

  1. TLS。
  2. 的SSLv3。
  3. 无论你做什么。
  4. 1和2已经有效了。

答案 3 :(得分:0)

我也在用C#编写网络协议。我已经使用加密来保护协议。这是我如何做的花费,你可能会觉得这很有用。

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

关于“我在想某种奇怪的哈希方法”,哈希通常只用于数据验证。即确保它不会在途中被修改。

希望这会有所帮助。