【问题标题】:Algorithm for client validation?客户端验证算法?
【发布时间】:2013-12-01 02:45:50
【问题描述】:

这就是我想要做的。

我有一个游戏和一个服务器可执行文件。客户端连接到服务器进行播放。

我目前担心的是有人可能会使用 telnet 或其他东西来模拟客户端。

目前,用户只在连接后发送一个简单的 hello 字符串,如果正确,我会接受来自他们的数据。

我尝试使用证书/ssl 没有成功,因此我试图找出一种有效的方法来了解游戏客户端是否真的是客户端。

简单地说,验证客户端的有效方法是什么?

我不关心中间人攻击,因为用户不登录也不提供密码,只是一个会话名称。

我想到了服务器发送一个固定长度的随机字符串的可能性,然后客户端用算法修改这个字符串,然后将它发送回来。

我想知道是否有比这更好的更聪明的方法。

我的服务器确实有一个证书,它是一个 pfx,如果有帮助的话。

谢谢

【问题讨论】:

  • 很抱歉,如果用户不提供用户名/密码,那么保护您的服务器有什么意义呢?如果任何人都可以连接,那么任何人都没有必要模仿客户端。
  • @PawełStawarz 我同意,但如果他们可以冒充客户端,他们可能会发送格式错误的游戏消息,这可能会导致服务器冻结或崩溃。
  • 如果您没有命令服务器崩溃或冻结的消息,它们就不能。但是他们可以 DoS 或“Ping of Death”你,如果是这样,你的问题就在其他地方。
  • @Milo 您认为您的问题是“如何确保服务器可以信任客户端”,但事实是,您无法确保它。你的整个问题只是被误导了。您必须以一种不信任其客户端的方式设计您的服务器。实际上,任何理智的服务器都必须对它从客户端获取的数据极度偏执。
  • 我支持 syam。虽然测试您的连接的明显有效性可能会带来一点好处,但您仍然需要假设它们是敌人,并进行基本的错误检查,并且只接受您想要并且可以处理的表单的输入。

标签: c++ c algorithm security client-server


【解决方案1】:

作为一个问题,它本质上是困难的。当然,没有任何软件是你可以编写的,可以在外国机器上运行的,可以证明它是你以未经篡改的形式编写的程序。

不过,您可以做一些简单的挑战响应来改进事情。

让我们假设您的客户端和您的服务器共享一个秘密(您编写它,所以他们可以,虽然作为软件它不会很秘密。)我们还假设您有一个方便的 crypt 或散列库(对于 SHA-1 之类的东西)哈希)然后:

  • 服务器发送挑战,包括随机数(例如时间 + 随机数)。
  • 客户端发送一个响应,其中包括(nonce + secret)的安全哈希
  • 服务器知道随机数和秘密,因此他们可以检查收到的哈希是否正确,从而可以确认“客户端”也知道秘密。

这是一个基本的对称验证方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2012-08-25
    • 2019-01-04
    • 2017-10-02
    相关资源
    最近更新 更多