2017-08-14 56 views
-3

我正在开发一款游戏,如果用户赢得比赛,我需要存储当前分数以添加新分数。 看谷歌的游戏样本,我发现此评论:Android加密文件存储游戏得分

public void saveLocal(Context ctx) { 
     /* TODO: This is left as an exercise. To make it more difficult to cheat, 
     * this data should be stored in an encrypted file! And remember not to 
     * expose your encryption key (obfuscate it by building it from bits and 
     * pieces and/or XORing with another string, for instance). */ 
    } 

它们存储在本地得分点,那么他们点添加到这个局部变量上传在排行榜上的新成绩。

实现此功能的任何示例? 有没有更好的方法来做到这一点?

回答

3

基于点的游戏存在的问题是,您必须将分数保存在应用可以访问的地方。因此,精通技术的用户可以尝试对您的游戏进行逆向工程,从而修改他们的分数。


阻止用户这样做的最简单方法是将分数存储在应用程序专用的存储中(因此存储在首选项或/ app/data/yourpackage中 - 只是不引用此路径,请使用getFilesDir()) 。但是,这不会阻止用户使用固定电话,因为他们可以访问这些文件。

下一步是使用一些任意的数据格式(可能使用标准的java序列化)在一个文件中序列化这个分数 - 你的用户将不能再读取该文件。要修改分数,他们需要知道在Android中进行开发(反编译&反序列化)

要提高安全性甚至更多,您可以在序列化后对此文件进行加密(或者更好 - 加密序列化您的分数的流) 。有关如何加密文件,请参阅here。将加密/解密所需的密钥存储在代码中。

因为密钥存储在您的代码中,所以可以在反编译应用程序后读取密钥。除了难以获得(安全低谷)之外,没有办法解决这个问题。您可以通过混淆您的代码并将加密密钥分散到整个项目中的多个部分来实现此目的。


请注意,没有完美的方式来阻止用户的作弊行为 - 您可以在路上放置石块。



端节点:加密的出口在美国被调整 - 这会影响你,如果你打算发布应用程序槽谷歌发挥你的应用在美国
开始here托管阅读更多那。

+0

我正在使用此库存储它:https://github.com/orhanobut/hawk/tree/hawk1 –

+1

库本身看起来不错。我仍然没有存储得分的确切值,但是像一个补充值(在java中用〜VARIABLE完成)。记得检查有关加密的出口法律。 – Ch4t4r

+0

但我有一个新问题,如果用户按“从这个应用程序删除数据”再见我的本地存储 –