保护数据库免受root设备的攻击

时间:2013-07-24 06:55:38

标签: java android database-connection

想象一下,我有一个游戏,我需要为每个用户保存数据,如关卡,高分,金牌...... 如果我在本地(在用户的设备上)保存了其中一些,那么它们确实非常安全,并且可以由具有root设备和一点技巧的用户修改。 (正如所讨论的here

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

然后我意识到这不是更安全:如果有人可以获得我的APK,他可以反编译它,获得用于发布高分的代码,并编辑它以始终发布1,234,567(并再次编译)或者只是提取它并发布任何高分。

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

如何保护我的应用/数据库不受此影响?

我的想法:

  1. 加密我发布的所有内容:无法正常工作,因为加密发生了 设备
  2. 使用来自数据库的种子加密我发布的所有内容:因为“黑客”可以获得种子,而不是更安全
  3. 为每个连接生成一个密钥:与第一个相同
  4. 用一句话: 只要“黑客”可以反映我的应用程序的行为,有没有办法确保我的数据库的连接实际上是由我的应用程序而不是其他人打开的?

1 个答案:

答案 0 :(得分:1)

你需要改变你的方法。如果您不希望用户更改数据,请不要将其放在他们的设备上。服务器需要是您提供的示例中的数据主服务器。仅将本地数据库用作用于显示的缓存,然后在可能的情况下同步并对其进行验证。这样,如果root用户选择更改其设备数据库,则无关紧要。发布到您的服务器的所有数据都需要来自经过身份验证的用户。无法确保数据未在用户设备上进行本地篡改。

反编译您的应用不应该让用户以任何方式将数据发布到您的服务器。让用户对您的服务器进行身份验证,然后给他一张过期的票证/令牌作为回报。查看AccountManager和示例SampleSyncAdapter。官方开发者网站也有一些很好的阅读。 Handling User Data

  

通常,我们建议尽量减少要求用户凭据的频率 - 使网络钓鱼攻击更加显着,并且不太可能成功。而是使用授权令牌并刷新它。

     

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

另请参阅Signing your application如何确保应用的“已批准”版本可以与您的服务器进行通信。