安卓安全:应用程序私有数据有多安全?

3
我有一个应用程序,它将机密信息存储在应用程序私有数据文件夹中的文件中。
我想知道这样做有多安全。
据我所知,在Android设备上,其他应用程序无法访问该文件。
假设:
- 设备未取得root权限 - 锁屏受密码保护 - 黑客盗取了该设备并且强制获取该文件
有哪些技巧可以获得该文件?我的意思是:
- 在这种情况下,是否有可能使设备获取root权限,然后获取该文件? - 黑客能否从设备中取出闪存芯片,然后使用任何工具对其进行分析。Android是否进行任何加密以防止这种情况发生? - 还有其他获取该文件的方法吗?
完全保护该文件有可能吗? 也许应用程序可以拥有自动启动服务来监视root状态。 如果设备被root,则服务会立即删除该文件。
谢谢!

现在大多数Android设备都有一个选项,在设置菜单中加密手机上的数据。您可以在将文件保存到磁盘之前自己加密文件。此外,如果手机已经root,那么没有任何阻止root用户访问他们想要的任何文件的措施。 - nathansizemore
写入文件时加密怎么样? :) - cgew85
新版本的Android(5.0)可以加密文件系统,如果用户使用的话。对于其他事情,一旦一个聪明的人物获得了机器的物理访问权限,你就可以考虑一切都可能会丢失:你无法防止系统被获取root权限或任何其他方式... - eduyayo
我的应用程序需要读写该文件,因此从黑客的角度来看,加密是无用的。如果我的应用程序可以读写该文件,那么黑客“轻松地”可以在应用程序中找到适当的代码,并使用它来揭示文件的内容。 - Zsolt
1
如果您在XDA论坛上提出这个问题,您可能会得到更好的答案。简而言之:1)设备可以被root(90%的Android设备可root),2)您的设备可以使用特殊工具挂载,该工具可以将整个ROM(即Android固件)从您的设备中取出,3)然后可以像普通存档一样浏览ROM列表,其中包括您的系统和任何其他目录或ROM中的信息,4)可以使用特殊工具对ROM中的APK进行反汇编 - 只需要知道如何读取baksmali-低级语言,就像Assembly一样。 - ChuongPham
您可以使用AES加密模块(例如BouncyCastle)来保护本地设备上的数据。大多数现代关系型数据库管理系统(RDBMS)都提供了AES加密和解密数据的方法,因此您可以从数据库中解密数据,将其发送到设备进行一些工作,再通过您的应用程序使用AES加密模块重新加密数据,并将其发送回数据库。当然,根据您的需要,您可能希望在数据库和设备之间使用诸如HTTPS、SFTP等协议来实现安全通信渠道。 - ChuongPham
2个回答

2
“在这种情况下,是否可能获取设备的root权限并获得该文件?”

是的,前提是:

  • 黑客可以暴力破解密码,并且
  • 设备通常可以被root(并非每个设备都有已知的root方法)
“黑客能否从设备中取出闪存芯片,然后使用任何工具进行分析。”
理论上可以,但这样做不容易而且可能会对芯片造成物理损坏。
“Android是否采用任何加密来防止这种情况发生?”
Android提供了全盘加密,并且新的Android 5.0设备默认启用。旧版Android设备的全盘加密可以被暴力破解;Android 5.0的加密似乎在这方面更强大,尽管只有时间才能告诉我们它是否也存在漏洞。
“是否有可能完全保护该文件?”
首先不要将该文件放在设备上。
或者,使用用户已知且足够强的密码短语自己加密。你最终会达到这样一个点:用 $5扳手比试图黑进设备更可行。
也许该应用程序可以有一个自动启动服务来监视rooted状态。如果设备被root了,该服务将立即删除文件。
在某些情况下,您的应用程序无法运行,部分原因是操作系统不一定在正常模式下运行。
此外,即使您的应用程序正在运行,攻击者也会在通过锁屏并尝试设置root访问之前从设置中强制停止它。
而且,这假设您的应用程序知道所有可能检测到root访问的方法,这似乎不太可能。
我的应用程序需要读写那个文件,所以从黑客的角度来看,加密是无用的。
只有在您的应用程序不需要用户提供密码短语即可“读写该文件”的情况下才是如此。在这种情况下,您唯一的绝对防御措施就是没有该文件。其他所有措施只能减缓攻击速度,但不能阻止攻击。

不知道锁屏密码的情况下是否可以对设备进行root?我之所以问这个问题是因为如果用户使用6个字符[a-z]的密码,那么暴力破解最多需要尝试26^6次。每5次尝试后,它必须等待30秒(因为Android),这意味着要尝试每个组合需要58年时间。对我来说听起来很好。因此,如果设备未经root并且具有至少6个字符长的锁屏密码,并且文件系统已加密,则我认为它足够安全。你怎么看? - Zsolt
@Zsolt:“不知道锁屏密码是否可以对设备进行root?”--我不能排除这种可能性,但在Android 4.2+设备上,我的猜测是您需要解锁设备。“每5次尝试后,它必须等待30秒(因为Android),这意味着要尝试每个组合需要58年”--您假设这是暴力破解的最佳方法。“你怎么看?”--我认为我不知道您试图保护什么,任何有关安全措施的智能讨论都从此开始。对于国家机密来说合理的措施对于自拍来说并不合理。 - CommonsWare
你知道其他的暴力破解方法吗?如果设备没有被root,那么你无法访问password.key文件来加速进程,所以你必须使用一些USB键盘仿真解决方案来自动完成此过程。如果这是真的,那么我认为它已经足够安全了。但我没有听说过其他的方法。这就是为什么我要问你们的原因。 - Zsolt
1
@Zsolt: "你知道有其他的暴力破解方式吗?" -- 是的。讨论这些技术不是 Stack Overflow 的话题。 - CommonsWare
我真的不想知道具体的技术。你能估计一下非常熟练的黑客需要多长时间才能获取手机的root权限/或者那个文件/或者绕过锁屏密码吗? - Zsolt
1
@Zsolt:这取决于设备的年代和PIN/密码的强度。如果我没记错,几分钟到几小时是完全合理的时间范围。您可以请求成为设备管理员,从而强制用户使用更好的密码。 - CommonsWare

1
在非root设备上,应用程序在进程和文件系统级别上被沙盒化。每个应用程序都有自己的文件系统空间,只有它才能访问。应用程序可以选择使文件全局可读/写,但默认情况下它们不是。但是,正如一些评论和您的原始帖子中所指出的那样,如果设备已经root,则攻击者可以在文件系统中的任何地方访问文件。Android 5.0通过启用完整的强制执行Linux SE策略来缓解这种情况,因此,如果特权系统进程受到攻击,则会受到SE策略的限制。
话虽如此,最好的做法是假设一旦您的数据进入文件系统,如果没有受到保护,它就可以被读取。您可以利用javax加密包来加密文件数据。最好通过密码进行保护,并使用适当哈希(PBKDF2)为文件创建一个密钥,而不是在应用程序中硬编码它。有许多关于最佳方法的文章。
请注意,Android 5.0的“加密文件系统”并不能完全保证这一点。加密文件系统为您提供了在设备开机时保护数据分区的功能。用户提供的密码在引导时用于挂载加密分区(就像桌面操作系统的加密卷一样)。一旦它被挂载,它看起来就像任何其他已挂载的文件系统。

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