Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止人们对我的网络协议进行反向工程_C#_Security_Networking_Obfuscation - Fatal编程技术网

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

C# 防止人们对我的网络协议进行反向工程,c#,security,networking,obfuscation,C#,Security,Networking,Obfuscation,我知道我不能阻止人们对我的协议进行反向工程,但我想采取一种通过隐蔽性实现安全的方法,使之尽可能地困难 我有一个服务器/客户机系统,通过网络与http风格的数据包进行通信 例如: Header Attribute: Value Attribute2: Other Value Payload 我想让我的客户以外的任何人都尽可能难以访问网络。把他们反编译我的程序集的问题推到一边-我可以对这个网络规范做些什么好的事情,这会使很难理解并在没有源代码的情况下进行另一个实现 我在想某种奇怪的散列方法或某种

我知道我不能阻止人们对我的协议进行反向工程,但我想采取一种通过隐蔽性实现安全的方法,使之尽可能地困难

我有一个服务器/客户机系统,通过网络与
http
风格的数据包进行通信

例如:

Header
Attribute: Value
Attribute2: Other Value

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

我在想某种奇怪的散列方法或某种加密算法,这会很困难


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

好吧,有三种情况:

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

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

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

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


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

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

您所能做的就是:

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

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

我还在用C#编写网络协议的过程中。我已经使用加密来保护协议。这是我做这件事的花费,你可能会发现这很有用

  • 一旦客户机连接服务器并从客户机请求随机UUID,客户机就会使用服务器和客户机都知道的密码对该UUID进行加密
  • 此后服务器或客户端发送的所有数据包都将使用该UUID作为密钥进行加密
关于“我在想某种奇怪的哈希方法”,哈希通常只用于数据验证。i、 e.确保在发送给您的途中未对其进行修改


希望这有帮助

有三种解决方案:

  • TLS
  • SSLv3
  • 不管你做什么

  • 1和2已经可以工作了。

    使用一些加密怎么样?@zerkms:建议在我的question@caesay:为什么您认为使用一些可用的加密很困难,但发明一种新的加密很容易?不存在通过模糊实现的安全性。充其量,您可以加密连接(ssl等),但如果某些人有一个毫无意义的客户端应用程序副本。游戏制造商在这方面投入了多少?破解需要多长时间才能破解?@AdamHouldsworth:我不是在说我的源代码。@Cicada你认为找到钥匙比反向工程一些源代码容易。我宁愿相信安全专家的实现,而不是我自己的加密。@Cicada我担心你的论点只不过是一种假设。我会将系统的这一部分转包给个人知道的人,或者简单地提取并重新使用它,而不必重新实现它。从我无知的角度来看是六加二三。@Adam:我认为你忽略了一个事实,即加密不是为了传输安全,而是为了协议混淆。然而,您是对的,协议甚至不需要反转来破坏它,因为您可以提取原始例程来实现它。到目前为止,我同意这只是另一种情况,在这种情况下,模糊性不会给你带来太多好处,但会带来巨大的成本(实现和维护自定义协议)。我很想看看你是如何使一个算法在代码中变得如此模糊,以至于有人无法对它进行反向工程,以了解它是如何在不相称的时间内工作的,从而使它变得不值得。整个算法在一天结束时可以归结为一个代码文件。是否真的存在客户无法访问客户代码的情况?@Cicada:我也是这么问自己的。并不否定这是一个好答案的事实。@caesay从未说过它不是。@Cicada当然,如果你把它放在你的黑匣子硬件中。例如,任何当前的gen游戏机(当然,它们可以并且已经被入侵)