- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,我将统计我正在构建的内容,以便如果有人对我的问题有替代解决方案。
Soo,基本上有一个游戏有多人游戏选项。
我拥有一个服务器..但是,存在一个问题,即人们向那里的游戏添加非法模组,以便能够在服务器中获得不公平的机会。
所以我的想法是为游戏创建一个自定义启动器,基本上首先检查游戏是否经过修改,如果没有,它会向玩家调用的服务器发送 TCP 请求 BLA
IP xx.xx.xx
没有任何模组,现在要加入。
顺便说一下,连接是通过 AES128 加密保护的。
现在谈谈我的实际问题。
Soo.. 当我创建加密/解密系统时。 (它是 AES 和 base64 的混合),我注意到人们可以嗅探套接字,然后复制从启动器发送到服务器的散列,然后使用任何套接字客户端应用程序简单地按原样发送该散列而无需修改。
然后服务器会简单地认为发射器发送了它并且实际上相信它然后允许该播放器:/
所以我要问的是,有什么办法可以解决这个问题吗?例如创建一种方法,使哈希只能使用一次。
非常感谢您提供的任何帮助。并且还接受了套接字以外的替代解决方案:)
最佳答案
这里有几个问题需要讨论,例如如何使加密通信不可重放,最终令人沮丧的是,即使解决问题也无法真正使系统安全。
要修复加密通信的可重播性,您可以使用已经防止这种情况的协议(protocol)(例如 SSH),或者推出您自己的解决方案并让您的服务器向客户端发送一个大的随机数,然后包括这个数字在包含哈希的加密有效负载中。然后,服务器可以轻松验证返回的数字是否与其生成的数字匹配,以确保没有重播整个有效负载。
然而,这里的问题与困扰客户端计算机上运行的所有 DRM 解决方案的问题相同,即您的代码可能会受到损害和调试。没有什么可以阻止攻击者简单地调试您的代码并找到您的加密 key ,从而能够制作他们自己的消息来表明他们的客户端是有效的。
这显然比简单的重放攻击更难,但如果您的游戏/服务器以任何方式流行,这不仅是可能的,而且很有可能。更复杂的客户端安全模型已被破坏,最终没有真正的方法使它们不可能,只是更困难(除了一些专用硬件解决方案)。
唯一真正的解决方案是确保客户端无法在服务器端占据优势。这意味着所有客户端操作都经过服务器端验证,并且客户端知识仅限于他们应该拥有的信息。不幸的是,这并不总是可以完美地完成,这就是为什么最流行的游戏仍然存在墙黑客和其他作弊的原因。
关于php - 如何通过套接字安全地发送二进制数据并确保没有人可以重新发送它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571674/
在我的 java 代码中,我做了类似的事情: int sleep = 0; sleep(sleep); sleep++; 被bos指出不好。它不能在 php 中正常工作。 在 java 中使用上述代码
我有一个程序使用第 3 方库进行一些计算,我在与主应用程序不同的线程上启动该程序。不幸的是,此计算可能需要很长时间,并且不提供进度更新和取消的接口(interface)。 为了拥有这样的界面,我想创建
C++ 是否有任何等效于 python 的函数 os.path.join?基本上,我正在寻找将文件路径的两个(或多个)部分组合在一起的东西,这样您就不必担心确保这两个部分完美地结合在一起。如果它在 Q
我正试图站起来(非商业)web application使用 neo4j Community 3.5.2 作为后端。 应用程序以两种方式与图形交互: 服务器端(安全的)用 flask 编写新的节点和关系
我正在开发一个将有许多外部用户的在线应用程序。至于现在,我的连接方法是为所有用户托管一个中央数据库,而他们从自己的服务器文件连接。 方法: PHP 连接文件(托管在他们的服务器上;文件由我提供) >>
我创建了一个将所有事件通知代码转换为字符串的函数。真的很简单。 我有一堆常量,比如 const _bstr_t DIRECTSHOW_MSG_EC_ACTIVATE("A video window i
我想将(附加)信息从过滤器传递到资源。我目前尝试这样做的方式是,在 Filter 中: getContext().getAttributes().put("additionalInformation"
我想计算转换系数。为此,我必须除以例如的最大值。 ushort 为 uchar 的最大值。 我想通过将参数传递给函数或类型名来动态地执行此操作。然后我想选择最大值并执行计算。 有两个问题: 如何动态选
我希望我的用户在用 Java 请求列表时能够编写自己的过滤器。 选项 1) 我正在考虑将 JavaScript 与 Rhino 结合使用。 我将用户的过滤器作为 javascript 字符串获取。然后
(安全地)提供来自不同域的图像是否符合 PCI 标准?我搜索了 PCI DSS 2.0 PDF,但没有找到任何引用资料。 最佳答案 图像不符合 PCI 合规性。 PCI DSS covers the
我们正在将 spring 和 hibernate 用于 web 应用程序:该应用程序有一个购物车,用户可以在其中放置商品。为了保存不同登录名之间要查看的项目,购物车中的项目值存储在表中。提交购物车时,
我正在为多个客户创建一个具有电子商务元素的 Rails 应用程序 - 我希望这些客户能够在管理区域中指定计算运费的公式;因为方法可能不同。 让我们假装一下,我允许他们输入 ruby 代码,然后我稍
我正在 Eclipse 中开发一个 Java 项目,使用 Maven 构建和管理依赖项。该项目分布在 5 个 Eclipse 项目中,其中一个是父 POM。我正在研究基于另一个团队实现的更复杂服务器的
我想在 ADO.NET 数据服务中存储每线程数据。在线程特定的静态变量上使用 ThreadStatic 属性是否安全,或者我会遇到问题吗?我担心的是,我的 ThreadStatic 变量在请求完成并且
Stackoverflow 上至少有一篇与此主题相关的帖子:Generate password in python 你会发现这个主题甚至在 PEP 中也受到了一些批评。这里提到:https://www
对于我工作中的一个项目,我需要创建一个独立的 Python 安装(来自源代码)。然而,完整的目录占用大约 90MB 的磁盘空间,虽然不多,但太多了,无法一遍又一遍地复制。 我可以从自定义 python
例如,我有一张学生表,我有一本 Python 字典 mydict = {"fname" : "samwise", "lname" : "gamgee", "age" : 13} 我怎样才能安全地生成一
我经常在代码中遇到使用 memset 手动零初始化的 POD 结构,如下所示: struct foo; memset(&foo, 0, sizeof(foo)); 我检查了 C++11 标准,它说:“
我是一名优秀的程序员,十分优秀!