内部存储有多安全?

8

我需要什么:

对于Android:我需要永久保存数据,但也要能够编辑(显然还要读取)。这些数据不应该被用户访问 - 它可以包含一些高分之类的东西,用户不能编辑。

我的问题:

我本来想使用Internal Storage,但我不确定它有多安全。在这里说:

您可以直接将文件保存在设备的内部存储器上。默认情况下,保存到内部存储器的文件对您的应用程序是私有的,其他应用程序无法访问它们(用户也不能访问)。当用户卸载您的应用程序时,这些文件会被删除。

这基本上正是我所需要的 - 但它真的很安全吗?它可以通过rooted设备(或其他方式)访问(可能只是读取)吗?

那SQLite数据库或共享内存呢?它们更适合保存(少量)数据吗?

此外:通常建议以不同的方式处理“秘密”数据吗?(例如不将其(内部)保存为整数/字符串,而是某种加密形式)


如果有疑问,就使用加密! - Kirk Backus
7
这个问题已经被问了很多次。如果用户拥有 root 权限,他们可以看到/改变任何东西。如果你想让它更难,可以加密。即使如此,你仍需要将密钥存储在某处,所以专门的人也可以破解它。 - Geobits
在已经取得 root 权限的设备上,没有任何东西是安全的。root 用户可以访问和修改任何文件、数据库,甚至内存(但普通用户可能不知道如何操作)。加密可以提高安全性,但高级用户仍然可以反编译您的 apk 并提取加密部分。 - zapl
那么唯一“真正”安全的存储选项就是除了设备本身以外的任何地方吗?(比如在Web服务器上-仍然不完全安全,但这是另一个话题) - Benjamin Schwalb
是的,基本上没错。这只取决于您需要多少安全性。如果仅用于个人高分列表,请选择内部/共享首选项。如果用户编辑自己的分数,谁在乎呢?如果它出现在排行榜上,请将其存储在排行榜所在的位置(服务器)。 - Geobits
3个回答

3

它可以通过已获取root权限的设备进行访问(也许只能读取)吗?

可以进行读写操作。

它可能包含像高分这样的东西,用户不得编辑。

这是用户的数据,而不是您的数据。这是用户的设备,而不是您的设备。因此,只要用户的数据存储在他们的设备上,用户就可以随意编辑该数据。

如果您想防止其他人编辑该数据,则使用用户提供的密码进行加密是合理的措施。对于游戏的高分似乎不必要。

否则,如果您不希望他们编辑该数据,请不要将其存储在他们的设备上。


1
如果这是某个梯子上的全球高分榜,我甚至不会让用户编辑它。(这将是作弊,对其他人不公平) - Benjamin Schwalb
@BenjaminSchwalb:要么这是“全局高分”的本地副本(在这种情况下,用户对其进行编辑并不重要,并且在稍后的网络操作之后,它将被您重新编写),要么您有一个非常奇怪的架构,其中一些随机用户恰好持有您的高分主副本。 - CommonsWare
高分是一个例子 - 让我们以用户ID为例:我需要将其保存在本地某个地方,并将其传递到数据库中,以知道要更新哪个用户 - 这也不应更改(它只分配一次,应保持不变)- 或者可能是一个配置文件,在其中存储诸如“我获得多少分数/金币/...来完成xy”这样的内容,这些也绝不能被编辑。(这只是例子,可能有更好的方法来完成所有这些,但这并不是真正的问题所在) - Benjamin Schwalb
@BenjaminSchwalb:用户ID要么是用户已知道的东西(因此与密码相关联,并且不是用户可以在无需其他帐户密码的情况下更改的内容),要么是50个字符以上的生成字符串(因此用户统计上不可能修改并提供有效值)。至于“配置文件”,要么不要在本地存储游戏规则,要么接受恶意人士可能会操纵这些规则的事实。 - CommonsWare
因此,答案仍然很简单:设备上没有任何东西是安全的,甚至包括代码。 - Benjamin Schwalb
@BenjaminSchwalb:是的。欢迎来到客户端编程的世界。:-) 轻度防护措施(例如将数据存储在内部存储器中,这样你必须获取 root 权限才能更改数据)是可以接受的,特别是那些从开发工作量角度来看“低成本”的防护措施。我会投资于一种架构,最大化地提高您更改初始逻辑的客户端或服务器端实现的灵活性。除此之外,在投入大量时间尝试建立进一步的防护措施之前,请等待看看您的游戏是否成功;只有当您真正拥有用户时,它们才有意义。 - CommonsWare

2

Shared Preferences不是作为一种可以从不同应用程序访问的存储选项吗?还是我误解了它? - Benjamin Schwalb
这也是我最初的想法。我认为它只能从包内使用。http://developer.android.com/guide/topics/data/data-storage.html#pref - Osmium USA
那么它就像内部存储一样可访问,只不过是使用 XML 而不是纯文本? - Benjamin Schwalb
没错,但是Android通过一个非常简单易用的API来处理这个问题。你可以获取应用程序实例的SharedPreferences,并开始读取。或者,从SharedPreferences实例获取编辑器,写入更改并提交编辑。非常简单 - 我喜欢它!只需查看我给你的链接。 - Osmium USA
是的,但是root@android。你是root。因此,你的论点是无效的。虽然我同意@Sirlate,但高分并不像信用卡那样需要保护(除非它能转化为真正的价值/奖品。那将需要更多的SSL和其他东西的工作)。如果15%的Android用户之一想要从游戏中获得乐趣并改变一个与现实生活无关的数字(除非它能转化为真正的奖品),那么这是他们的损失,而不是你的。 - Osmium USA
显示剩余2条评论

1
不,这并不安全。用户可以在已经取得root权限的设备和模拟器上修改文件。更好的方法是使用加密,但是加密并不百分之百安全。事实上,有经验的极客可以破解你的加密。我建议将不能被用户访问或篡改的关键数据保存在你的Web服务器上而不是用户的设备上。

为什么需要模拟器?只要我不分发.apk文件,它在模拟器上运行应该是“不可能”的吧?(或者你可以在从GooglePlay下载时获取apk文件吗?) - Benjamin Schwalb
已获取Root权限的用户可以从/data/app中提取APK文件。 - Machinarius
@benjaminschwalb 请看看这个 - Sadegh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接