我正在开发一款游戏,我需要存储当前分数,以便在用户赢得比赛时添加新分数。 看谷歌游戏样本我发现了这个评论:
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). */
}
他们将积分存储在本地得分中,然后他们将积分添加到此本地变量以在排行榜上上传新得分。
实现此功能的任何示例? 还有另一种更好的方法吗?
答案 0 :(得分:3)
基于点的游戏存在的问题是,您必须将分数保存在应用可以访问的位置。因此,精通技术的用户可以尝试对您的游戏进行逆向工程,从而修改他们的分数。
阻止用户这样做的最简单方法是将分数保存在应用程序的私有存储中(因此在首选项或/ app / data / yourpackage中 - 只是不要引用此路径,使用getFilesDir())。然而,这可以阻止用户访问root用户手机,因为他们可以访问这些文件。
下一步是使用一些任意数据格式(可能使用标准的java Serializable)在文件中序列化此分数 - 您的用户将无法再读取该文件。要修改分数,他们需要知道Android中的开发(反编译和反序列化)
为了进一步提高安全性,您可以在序列化后加密此文件(甚至更好 - 加密您对序列进行序列化的流)。有关如何加密文件,请参阅here。将加密/解密所需的密钥存储在您的代码中。
由于密钥存储在您的代码中,因此可以在反编译应用程序后读取密钥。除了让它更难获得(安全低谷)之外,没有办法解决它。您可以通过模糊代码并将加密密钥拆分为多个部分来实现这一点,这些部分会分散到整个项目中。
请注意,没有完美的方法来阻止用户作弊 - 你可以在路上铺石头。
侧节点:加密的导出在美国受到监管 - 如果您打算通过Google Play发布应用,因为您的应用在美国托管,这会影响您
开始here以了解更多内容。