有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java保护数据库免受根设备攻击

假设我有一个游戏,我需要为每个用户保存数据,比如关卡、高分、金牌等等
如果我在本地(用户的设备上)保存了其中一些,它们就不是真正安全的,可以由具有根设备和一点技能的用户修改。(如前所述here

所以我需要把它们放在我服务器上的一个数据库中——我会用一个Web服务和JSON连接到它

但后来我意识到这并不安全:如果有人能得到我的APK,他可以反编译它,获得用于发布高分的代码,或者编辑它,总是发布1234567(并再次编译),或者只是提取它并发布任何高分

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

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

我的想法:

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

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    In general, we recommend minimizing the frequency of asking for user credentials—to make phishing attacks more conspicuous, and less likely to be successful. Instead use an authorization token and refresh it.

    Where possible, username and password should not be stored on the device. Instead, perform initial authentication using the username and password supplied by the user, and then use a short-lived, service-specific authorization token.

    另外,看看Signing your application是如何工作的,以确保只有“批准”的应用程序版本才能与服务器通信