2015-10-18 159 views
3

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

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

+0

我想运行你的游戏在服务器上,只有坚持数据没有一个选项?否则,你只能让它“更难”作弊,但你永远无法完全防止它。如果您需要在用户拥有的设备上操作。 –

+0

如何让它变得更难? –

+0

混淆你的代码/保存文件。一个选项是“加密”保存文件并在代码中模糊密钥。加密可能是一个简单的XOR或转换。但是你不应该付出太多的努力,因为如果你的游戏变得流行起来,那么它就会被破解,破解者很可能会发布他们的作品,等等......代码混淆可以通过程序来完成,但这是最重要的可能是基于意见的问题。 –

回答

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但JSONs - 中y更方便,重量更轻。 Read how to handle it here


请记住,通常客户端加密是不是很不错的主意,总是能以某种方式被黑 - 但我敢肯定,如果它不是钱的问题没有人会认为它的价值。

如果您对保存数据更高级的方式感兴趣,最好的办法是通过SSL发送所有数据并将其保存在一些保安服务器中 - 尽管我不确定Libgdx是否具有良好的SSL机制,并不知道我可以推荐的第三方库。

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

+1

请注意,此加密在此上下文中提供与使用一个字节异或的相同安全性。为什么? Java很容易反编译。所以我只是反编译jar/apk(甚至有在线工具),复制代码并解密/加密保存文件。人们至少应该试着隐藏/模糊密钥,以便找到它更“难”。 –

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改变easly。

    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或偏好那些,但你可以使用一点点复杂的地穴,因为速度不是问题,因为你只导入/导出几次。