LibGDX:安卓游戏安全
Posted
技术标签:
【中文标题】LibGDX:安卓游戏安全【英文标题】:LibGDX : Android Game Security 【发布时间】:2016-01-16 19:59:11 【问题描述】:我正在使用 LibGDX 框架开发游戏。我想知道如何让游戏更安全。例如,具有根 android 设备的用户可以更改保存的 .xml 文件,这样游戏就会被黑客入侵,或者他/她可以使用 GameKiller 或类似的程序并更改游戏运行时值(金钱、exp 等)。那么我该如何预防呢?
桌面版也是一样,保存文件没有隐藏,玩家也可以在PC上找到该文件。并且可以使用 CheatEngine 或其他程序进行黑客攻击并再次更改运行时值。
【问题讨论】:
我猜想在服务器上运行你的游戏并且只保留数据没有选项?否则,你只能让作弊变得“更难”,但你永远无法完全阻止它。如果您需要在用户拥有的设备上进行操作。 我怎样才能让它变得更难一点? 混淆您的代码/保存文件。一个选项是“加密”保存文件并混淆代码中的密钥。加密可以是简单的异或或移位。但是你不应该投入太多精力,因为如果你的游戏流行,那么它就会被破解,破解者很可能会发布他们的作品等等......代码混淆可以通过程序完成,但这是大多数可能是基于意见的问题。 【参考方案1】:如果您不存储私人/重要数据,而只是想让您的游戏难以破解(例如通过更改游戏级别的 xml),您可以基于GWT Crypto library 实施加密
你初始化加密器的方式是:
//this will be used for encrypting and decrypting strings
private TripleDesCipher encryptor;
...
//creating key for encryptor
TripleDesKeyGenerator generator = new TripleDesKeyGenerator();
byte[] key = generator.decodeKey("04578a8f0be3a7109d9e5e86839e3bc41654927034df92ec"); //you can pass your own string here
//initializing encryptor with generated key
encryptor = new TripleDesCipher();
encryptor.setKey(key);
...
以及使用方法:
private String encryptString(String string)
try
string = encryptor.encrypt( string );
catch (DataLengthException e1)
e1.printStackTrace();
catch (IllegalStateException e1)
e1.printStackTrace();
catch (InvalidCipherTextException e1)
e1.printStackTrace();
return string;
private String decryptString(String string)
try
string = encryptor.decrypt(string);
catch (DataLengthException e)
e.printStackTrace();
catch (IllegalStateException e)
e.printStackTrace();
catch (InvalidCipherTextException e)
e.printStackTrace();
return string;
我还建议您不要使用 XML,而是使用 JSON - 它们更方便且重量更轻。 Read how to handle it here
请记住,客户端加密通常不是一个好主意,而且总是可能以某种方式被黑客入侵 - 但我很确定,如果它与金钱无关,没有人会认为它值得。
如果您对保存数据的更高级方法感兴趣,最好的办法是通过 SSL 发送所有数据并将其保存在一些保护良好的服务器中 - 尽管我不太确定 Libgdx 是否有任何好的 SSL 机制并且不知道我可以推荐的第三部分库。
保存文件的服务示例可以是Shephertz(我正在使用他们不错的 AppWarp,并将在我的应用程序中实现这个)。
【讨论】:
请注意,此加密在此上下文中提供与一个字节的异或相同的安全性。为什么? Java很容易反编译。所以我只是反编译jar/apk(甚至有在线工具),复制代码并解密/加密保存文件。至少应该尝试隐藏/混淆密钥,以便“更难”找到。【参考方案2】:您可以将它们用于运行时
-
双变量
作弊引擎和游戏杀手的双胞胎
int health=15;
int twinhealth=15;
if(HPtaken())
health+=10;//those twins will always change together
twinhealth+=10;
if(health!=twinhealth)//if they are different this means there is hack attempt
//punishment for hacker
-
加密变量
实际上它不是一个地穴,它只是对变量进行了少许更改,因此黑客无法通过 gamekiller 或作弊引擎轻松更改。
int health=15*7;
int twinhealth=15*7;
if(HPtaken())
health+=10*7;//those twins will always change together
twinhealth+=10*7;
drawhealth( health/7 );// So hacker going to see and search wrong value on cheatengine
-
加密孪生变量 :D
黑客禁止冻结并使用相同的值更改两个孪生。因此,至少其中一个双胞胎将被加密。
int health=15;
int twinhealth=15*5;
if(HPtaken())
health+=10;//those twins will always change together
twinhealth+=10*5;
if(health!=twinhealth*5)//if they are different this means there is hack attempt
//punishment for hacker
当然,黑客可以反编译 apk 并破解您的游戏,但这会使破解游戏变得有点困难。顺便说一句,您可以使用随机变量来编辑变量。
您可以应用 xml 或首选项,但您可以使用稍微复杂的 crypt,因为速度不是问题,因为您只导入/导出几次。
【讨论】:
以上是关于LibGDX:安卓游戏安全的主要内容,如果未能解决你的问题,请参考以下文章