【问题标题】:TCP secured connection - only via my clientTCP 安全连接 - 仅通过我的客户端
【发布时间】:2011-07-08 04:12:45
【问题描述】:

所以我的服务器和客户端之间有这个 TCP 连接,任何人都可以连接到我的服务器。但我想确保客户端真的在使用我的客户端应用程序,而不仅仅是伪造来自假 TCP 客户端的消息。有什么方法可以做到这一点,检查连接是否真的来自我的游戏客户端?

谢谢!

编辑 如果我要使用 TLS,我能解决这个问题吗?

【问题讨论】:

  • 不可能做到 100% 的可靠性。如果值得某人花时间这样做,他们会绕过你能想到的任何检查。无论你最终得到什么解决方案,只要让它比你使用连接的任何东西都更昂贵。
  • 哇,说的太对了。谢谢!!!!

标签: security tcp network-programming


【解决方案1】:

您的问题可能不会有一个完整的解决方案,因为无论您做什么,对方都可能总是拿走您的程序,在受监控的环境中运行它,操纵运行时数据并让它使用其“安全”网络协议.由于客户端应用程序在无法控制的手中,您永远无法确定它是您自己的程序。

小例子:我的应用程序运行您的应用程序并将数据回放到您的服务器,并将您的响应转发回应用程序。你怎么知道?

也就是说,使用 SSL 并将客户端的私钥硬编码到应用程序中可能是一种非常有前途的“99%”方法——你可以尝试一些技巧使其难以找到(例如,看看 Skype 是如何做到的) )。如果您随后还在您的程序中构建完整性检查,以确定是否有人在操纵内存或调试您的程序,您可以尝试让潜在对手更加困难。 (但请注意,您将始终必须将私钥与您的应用程序一起发送,因此发现它并不安全。)

【讨论】:

  • @user: Here, check it out -- 我敢肯定,如果你多花一个下午,你可以为你的客户准备类似的东西;-)
  • 我不明白。如果我要使用 TLS,那能解决我的问题吗?
  • @Eli:正如我所说,你的问题没有完整的解决方案。但是使用 TLS(或者更确切地说是 SSL?)允许您进行一些基于 PKI 的身份验证,这是一个相当好的开始。
  • 嗯,好吧..但是对吗? -> 通过 SSL 记录。登录后,客户端开始使用他们在 SSL 消息中约定的密钥从服务器发送和获取 TCP 消息。
  • 您应该阅读一些关于安全和密码学的基础知识。尝试Schneier's book 进行非常干净的展示。关键是 authentication 部分,通过它您可以验证客户端应用程序是否拥有(原则上)只有您可以提供的私钥。之后的加密是可选的,如果窃听不是问题,您可以使用 0 位加密。
【解决方案2】:

其他人对您的问题提出了有用的答案,但我将建议另一种方法。重新检查您的要求。

问问自己为什么你想知道客户端程序的身份。是不是让您对自己的客户端程序的信任度比对第三方客户端程序的信任度更高?

如果您需要信任已交付给客户的软件的身份或完整性,我声称您的安全模型已损坏。一旦软件在客户的 PC 上运行,您就应该认为它是邪恶的,即使是您最初编写的。

来自网络的任何状态、任何命令、任何数据都必须在被依赖之前进行检查。

【讨论】:

  • 我该怎么做?客户端是 iOS 设备。我认为检查客户端是最好的方法,因为唯一可能发生的事情就是我赔钱 - 如果玩家可以闯入我的系统,他可以添加自己花钱的项目,我不希望这样发生。也许1或2是可以的,但如果他们将破解分享到互联网上,我会损失很多钱。
【解决方案3】:

我的默认响应是使用质询/响应身份验证。

连接后,从服务器向客户端发送一个随机数
然后客户端使用哈希/密钥/....计算响应消息并将其返回给服务器

如果响应与服务器的计算相匹配,那么您的真实性机会就更大。请注意,您的客户的逆向工程师会使这种方法容易被欺诈。

【讨论】:

  • 另请注意,这会受到中间人攻击。攻击者让协议的那一部分运行完成,然后开始将他自己的命令注入到现在受信任的连接中。
  • 当然。 MitM 是许多潜在的陷阱之一。如果 OP 想要 SECURITY 而不是 security,我觉得他的研究会比这个查询更深入。
【解决方案4】:

您可以使用公钥/私钥对来验证您的身份。

http://en.wikipedia.org/wiki/RSA#Signing_messages

【讨论】:

  • 为了在服务器上进行身份验证,客户端需要使用它的私钥对消息进行签名。在通用系统上无法解决以应用程序用户无法访问的方式存储私钥的问题。
  • 我不能将它存储在代码中..? iOS 应用程序是客户端 - 我不认为它真的可以访问代码。 .
  • 无法访问您的源代码,但肯定可以访问客户端中包含的密钥。 iOS 设备可能会被越狱,这意味着您在应用中硬编码的任何内容都可以被第三方读取。
  • 硬代码 - 这是什么意思?你想告诉我越狱用户可以访问我所有的代码吗?
  • 这意味着你必须在你的程序中嵌入密钥。当有人下载​​您的程序时,他们会获得密钥的副本,如果他们知道自己在做什么,他们可以提取密钥并使用它制作一个可以模拟您的应用程序。见克雷克的回答。据我所知,不可能 100% 安全地做到这一点。
猜你喜欢
  • 2013-02-19
  • 2010-11-18
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2018-04-10
相关资源
最近更新 更多