-2

想象一下我有一个游戏,我需要为每个用户保存数据,比如关卡、高分、金币……
如果我在本地(在用户的设备上)保存了其中的一些数据,它们就不是很安全,可以修改由具有根设备和一点技能的用户。(如此处所讨论

所以我需要将它们放在我服务器上的数据库中——我会使用 web 服务和 JSON 连接到它。

但后来我意识到这并不安全:如果有人能得到我的 APK,他可以反编译它,获取用于发布高分的代码,然后将其编辑为始终发布 1,234,567(然后再次编译)或直接提取它并张贴任何高分。

在高分的情况下,这不是一个大问题 - 但有了这个,基本上可以获取/发布应用程序中使用的任何内容。

我怎样才能保护我的应用程序/数据库免受此影响?

我的想法:

  1. 加密我发布的所有内容:无法工作,因为加密发生在设备上
  2. 用数据库中的种子加密我发布的所有内容:因为“黑客”也可以获得种子,而不是更安全
  3. 为每个连接生成一个密钥:与第一个相同

一句话: 只要“黑客”可以反映我的应用程序的行为,有没有办法确保与我的数据库的连接实际上是由我的应用程序而不是其他人打开的?

4

1 回答 1

1

你需要改变你的方法。如果您不希望用户更改数据,请不要将其放在他们的设备上。服务器需要成为您给出的示例中数据的主人。仅将本地数据库用作用于显示的缓存,然后在可能的情况下根据您的服务器同步和验证它。这样,root 用户是否选择更改他的设备数据库并不重要。发布到您的服务器的所有数据都需要来自经过身份验证的用户。无法确保数据不会在用户设备上被本地篡改。

反编译您的应用程序不应公开任何方式让用户将数据发布到您的服务器。让用户通过您的服务器进行身份验证,并给他一个过期的票证/令牌作为回报。查看AccountManager和示例 SampleSyncAdapter。官方开发者网站对此也有一些很好的阅读。处理用户数据

一般来说,我们建议尽量减少询问用户凭据的频率,以使网络钓鱼攻击更加明显,并且不太可能成功。而是使用授权令牌并刷新它。

在可能的情况下,用户名和密码不应存储在设备上。相反,使用用户提供的用户名和密码执行初始身份验证,然后使用短暂的、特定于服务的授权令牌。

还要查看签名应用程序的工作原理,以确保只有“已批准”的应用程序构建才能与您的服务器通信。

于 2013-07-24T08:58:19.507 回答