【问题标题】:LibGDX : Android Game SecurityLibGDX:安卓游戏安全
【发布时间】:2016-01-16 19:59:11
【问题描述】:

我正在使用 LibGDX 框架开发游戏。我想知道如何让游戏更安全。例如,具有根 android 设备的用户可以更改保存的 .xml 文件,这样游戏就会被黑客入侵,或者他/她可以使用 GameKiller 或类似的程序并更改游戏运行时值(金钱、exp 等)。那么我该如何预防呢?

桌面版也是一样,保存文件没有隐藏,玩家也可以在PC上找到该文件。并且可以使用 CheatEngine 或其他程序进行黑客攻击并再次更改运行时值。

【问题讨论】:

  • 我猜想在服务器上运行你的游戏并且只保留数据没有选项?否则,你只能让作弊变得“更难”,但你永远无法完全阻止它。如果您需要在用户拥有的设备上进行操作。
  • 我怎样才能让它变得更难一点?
  • 混淆您的代码/保存文件。一个选项是“加密”保存文件并混淆代码中的密钥。加密可以是简单的异或或移位。但是你不应该投入太多精力,因为如果你的游戏流行,那么它就会被破解,破解者很可能会发布他们的作品等等......代码混淆可以通过程序完成,但这是大多数可能是基于意见的问题。

标签: android security libgdx


【解决方案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】:

您可以将它们用于运行时

  1. 双变量

作弊引擎和游戏杀手的双胞胎

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
}
  1. 加密变量

实际上它不是一个地穴,它只是对变量进行了少许更改,因此黑客无法通过 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     
  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 或首选项,但您可以使用稍微复杂的 crypt,因为速度不是问题,因为您只导入/导出几次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多