Android 游戏中的 SharedPreferences 和作弊

SharedPreferences and cheating in Android games

我游戏中的高分目前存储在 SharedPreferences:

<?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>

像这样,可以在获得 root 权限的设备上操作分数。 (xml 文件被拉到 PC,编辑,然后推回设备)。

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

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

也许您可以将 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 时你会得到一些整数(写成字符串)。 如果用户更改哈希,它可能会被解密为非整数值(无法解析为整数)

None 将能够在不知道您的散列密钥的情况下解密,该密钥将作为您程序中的某个常量字段保存。

并且你可以制作一些像这样的陷阱字段,用户可能会认为分数 xml 名称是 level_1_score 但如果用户更改它,你可以抓住用户作弊。 (因为没用过)

是的,即使在 MODE_PRIVATE 中,root 设备应用程序也可以访问您的共享首选项。最糟糕的是,使用与您的游戏应用程序的共享首选项相同的 UID 可以被编辑。

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

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