Java (安卓)通过简单的套接字攻击服务器

Java (安卓)通过简单的套接字攻击服务器,java,android,security,sockets,Java,Android,Security,Sockets,我写了一个Android游戏。现在,我想连接球员的标记 下面的代码是客户端程序,它将它们的名称、国家和标记发送到服务器。基本上,我使用“:”来分隔信息 不过,黑客可以通过反编译.apk文件来了解我的服务器ip和端口。然后,他们可以创建一个基本的java应用程序来访问我的服务器。他们可以发给我“黑客:坏服务器:123456789”。最后,最上面的标记变成“123456789” 连接用户数据是否更安全 Socket client = new Socket(ip, port); OutputStrea

我写了一个Android游戏。现在,我想连接球员的标记

下面的代码是客户端程序,它将它们的名称、国家和标记发送到服务器。基本上,我使用“:”来分隔信息

不过,黑客可以通过反编译.apk文件来了解我的服务器ip和端口。然后,他们可以创建一个基本的java应用程序来访问我的服务器。他们可以发给我“黑客:坏服务器:123456789”。最后,最上面的标记变成“123456789”

连接用户数据是否更安全

Socket client = new Socket(ip, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hacker:HK:3910");

黑客不需要APK来确定服务器的IP。他们可以简单地使用代理工具,如Fiddler或数据包嗅探器

在我作为一名游戏开发者的短暂工作期间(致力于网络多人游戏功能),你学会了仅仅假设骗子和黑客拥有你游戏的源代码。然后围绕这个假设设计协议

那么,您如何保护您的服务器免受恶意客户端的黑客攻击或欺骗呢?你真的不能,但有些事情让它变得非常困难

  • 在允许用户将任何内容发布到服务器之前,要求用户从游戏“登录”(名称/密码)。如果你发现有人作弊,通过禁止他们登录来禁止他们的帐户玩游戏。在服务器验证的每个HTTP请求的头中使用“票证”或身份验证令牌。如果你禁止某人,那么他们获得一个新帐户再试一次会很烦人

  • HTTPS而不是HTTP。从技术上讲,黑客可以通过简单地将其恶意客户端更改为使用HTTPS发布来克服这一问题。他可以通过调试你的APK对协议进行反向工程。但是现在你让他很难发现协议的开头。有了HTTPS,黑客无法使用Fiddler等简单工具来观察网络流量

  • 在发布版本中小心调试喷涌。确保与任何协议相关的“日志”语句仅在调试版本中,而不在发布版本中

  • 混淆所有内容,并使用HMAC之类的工具用密钥“签名”每条消息。从技术上讲,这并不安全,但会使破坏加密的人更难继续。如下所示:

  • SGFja2Vy:UX:AAAAA5EC:blahblahxyxunreadable
    
    范例 代码:

    其中,“您的加密密钥”在源代码中的某个地方编码,并且仅在运行时解密

    上述内容将生成类似以下内容的字符串:

    SGFja2Vy:UX:AAAAA5EC:blahblahxyxunreadable
    
    相应的服务器代码将对消息进行解码,并在接受之前使用密钥进行验证

    这是完美的安全吗?没有

    我应该用这些技术构建一个电子商务解决方案吗?绝对不是

    这些技术是否能阻止99%的偶然黑客进行欺骗?当然

    它是否击败了那些不惜一切代价想要赢得高分的最坚定的黑客?也许不是。但“努力回报”的比例却在上升。这可能不值得他们花时间


    希望这能有所帮助。

    这个问题似乎离题了,因为它是关于安全问题的。检查当然,在你认为这个问题(以其当前形式)适用于那里之前,请检查他们的帮助中心。另一个好主意是将用户密码作为你的密钥的一部分。@Ilya_Gazman-好主意。还将服务器生成的cookie和时间戳等附加噪声注入哈希字符串,以阻止重播攻击的发生。