我写了一款Android游戏。现在,我想连接玩家的标记。
以下代码是客户端程序,它将其名称,国家和标记发送到服务器。基本上,我使用':'分开信息。
但是,黑客可以通过反编译.apk文件来了解我的服务器IP和端口。然后,他们可以创建一个基本的Java应用程序来访问我的服务器。他们可以发送给我" hacker:badserver:123456789"。最后,顶部标记变为" 123456789"。
连接用户数据是否更安全?
Socket client = new Socket(ip, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hacker:HK:3910");
答案 0 :(得分:2)
黑客不需要APK来确定您的服务器的IP。他们可以简单地使用代理工具,如Fiddler或数据包嗅探器。
在我作为游戏开发者(处理网络多人游戏功能)的短暂工作期间,您学会假设骗子和黑客拥有游戏的源代码。然后围绕这个假设设计协议。
那么你如何防止你的服务器遭到恶意客户端的攻击或欺骗?你真的不能,但这里的一些东西让它变得非常困难。
要求用户在允许其向您的服务器发布任何内容之前从游戏中“登录”(名称/密码)。如果你抓到某人作弊,禁止他们的帐户通过禁止他们登录来玩游戏。在服务器的每个HTTP请求的标头中使用“ticket”或auth令牌进行验证。如果你禁止某人,那么让他们获得一个新帐户再试一次会很烦人。
HTTPS而不是HTTP。从技术上讲,黑客可以通过简单地将他的流氓客户端改为使用HTTPS发布来打败这个。他可以通过调试你的APK来对协议进行逆向工程。但是现在你已经让他更难以发现协议的开始。使用HTTPS,黑客无法使用Fiddler等简单工具来观察网络流量。
警惕发布版本中的调试开发。确保与任何协议相关的“Log”语句仅在调试版本中,从不发布版本。
对所有内容进行模糊处理,并使用HMAC之类的东西用密钥“签名”每条消息。从技术上讲,这不是安全性,但对于任何破解加密的人来说,这将会更加困难。类似于以下内容:
实施例 代码:
name = BASE64("Hacker");
messagetype = ROT13("HK");
score = 3910;
tosend = name + ":" + messagetype + ":" + Integer.ToString(score ^ 0xAAAAAAAA) + ":";
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(Your_Secret_Key);
byte[] rawHmac = mac.doFinal(data.getBytes());
tosend += Encoding.EncodeBase64(rawHmac);
其中“Your_Secrey_Key”在源代码中的某处编码,并且仅在运行时解密。
以上将生成类似于以下内容的字符串:
SGFja2Vy:UX:AAAAA5EC:blahblahxyxunreadable
相应的服务器代码将对消息进行解码,并在接受之前使用密钥进行验证。
这是完美的安全吗?没有。
我应该使用这些技术构建电子商务解决方案吗?绝对不是。
这些技术是否可以避免99%可能会被欺骗的休闲黑客?绝对。
它是否击败了最不确定的黑客,不惜一切代价赢得高分?也许不吧。但“努力奖励”比率上升。这可能不值得他们花时间。
希望这有帮助。