LibGDX: Android游戏安全

4
我正在使用LibGDX框架开发游戏。我想知道如何使游戏更加安全。例如,使用具有root权限的Android设备的用户可以更改save.xml文件,从而导致游戏被破解,或者他/她可以使用GameKiller或类似的程序来更改游戏运行时数值(金钱、经验等)。那么我该如何防止这些问题的出现呢?
对于桌面版本也是同样的情况,保存文件不隐藏,玩家也可以在PC上找到该文件。玩家可以使用CheatEngine或其他类似的程序进行作弊,并再次更改运行时数值。

我猜在服务器上运行游戏并仅在那里持久化数据不是一个选项?否则,您只能使作弊变得“更困难”,但永远无法完全防止它。如果您需要在用户拥有的设备上操作。 - Pinkie Swirl
那我该如何让它更加困难一些呢? - Vahe Muradyan
混淆你的代码/保存文件。一个选项是"加密"保存文件并混淆密钥在你的代码中。加密可以是简单的异或或移位。但是你不应该投入太多精力,因为如果你的游戏变得受欢迎,那么它将被破解,破解者很可能会发布他们的工作,等等... 代码混淆可以通过程序完成,但这最可能是一个基于观点的问题。 - Pinkie Swirl
2个回答

0
如果您不存储私人/重要数据,但只想让游戏难以被黑客攻击(例如通过更改游戏级别的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 - 它们更方便且更轻量级。在这里阅读如何处理它


请记住,通常客户端加密并不是一个很好的主意,总能以某种方式被黑客攻破 - 但我非常确定,如果这不涉及金钱,没有人会认为它值得。

如果您想更高级地保护数据,最好的方法是通过SSL发送所有数据并将其保存在一些受到良好保护的服务器上 - 虽然我不太确定Libgdx是否有任何良好的SSL机制,并且不知道可以推荐的第三方库。

用于保存文件的服务示例可以是Shephertz(我正在使用他们很好的AppWarp,也打算在我的应用程序中实现这个)。


1
请注意,这种加密在这个上下文中提供的安全性与使用一个字节进行异或操作相同。为什么呢?Java很容易被反编译。因此,我只需反编译jar/apk文件(甚至有在线工具可供使用),复制代码并解密/加密保存文件。至少应该尝试隐藏/混淆密钥,以使其更难找到。 - Pinkie Swirl

0

您可以在运行时使用它们

  1. 双变量

适用于 CheatEngine 和 GameKiller 的双倍

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或Cheatengine进行更改。

    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     
    
    1. 加密的双生变量 :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或首选项,但是您可以使用稍微复杂的加密,因为速度不是问题,因为您只需要导入/导出几次。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接