2015-04-05 113 views
0

榜在我的游戏当前存储在SharedPreferences作弊:SharedPreferences和Android游戏

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <long name="level_1_score" value="1000" /> 
    <long name="level_2_score" value="1100" /> 
</map> 

与此类似,分数可以上扎根设备进行操作。 (该XML文件被拉到PC,编辑,然后推回到设备)。

防止这种情况的最佳方法是什么?

+0

为什么你在意用户是否在自己的设备上改变了自己的高分? – CommonsWare 2015-04-05 11:35:46

+0

总分将被提交给公共排行榜。这个分数是通过总结个人水平分数来计算的。 – Pawel 2015-04-05 11:42:05

+0

那么为什么'SharedPreferences'中的值不仅仅是一个本地数据缓存,其中记录系统是服务器? – CommonsWare 2015-04-05 11:42:40

回答

1

也许你可以使用sharedPreferences和MODE_PRIVATE,但是如果你想确信你可以散列名称和值,并添加一些额外的未使用的字段来检测是否有人试图改变你会知道的偏好。例如

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <long name="asdadadad" value="ASDASDASDAS" /> 
    <long name="asdadadadas" value="ADQOWI232DJQO1231" /> 
    <long name="level_1_score" value="1000" /> 
    <long name="level_2_score" value="1100" /> 
</map> 

你散列名称和值,你会得到的图片像这样的。当你解密asdadadad时,你会得到level_1_score,当你解密ASDASDASDAS时,你会得到一些整数(用字符串写)。 如果用户更改散列值,它可能解密为非整数值(这将不可能解析为整数)

如果不知道您的散列键,将无法解密,该键将被保存为某个常量字段你的程序。

而且你可以制作一些这样的陷阱字段,用户可能会认为得分xml的名字是level_1_score,但是如果用户改变了这一点,你可以捕获用户作弊。 (因为它没有使用)

2

最简单的方法可能是使用Google的App Licensing库中的PreferenceObfuscator。这仍然可以通过反编译你的应用程序来打败,但屏障要高得多。

0

是的,即使在MODE_PRIVATE中,根设备应用程序也可以访问您的Shared Prefs。最糟糕的是,使用与您的游戏应用程序的共享偏好设置相同的UID可以编辑。

但是,为什么不尝试加密呢? ;)

确保将密钥保存在服务器上。

+0

如果您将密钥保存在服务器上,则必须提供https连接:D或用户可以使用程序等'wireshark'捕获流量,而不是解密它。 但谁会为游戏做? O.o – 2015-04-05 11:36:21

+0

是的,总有一种方法。但是这可以防止大多数饼干,因为密钥不会在代码中硬编码。如果有人拿到游戏的apk文件,他们可以解开课程并找到密钥。 – Kay 2015-04-05 11:39:07

+0

是的,您可以做的最好的事情是防止用户轻易破解您的代码。 – 2015-04-05 11:42:40