保护Android应用程序敏感数据的最佳方式?

是的,这是一个相当普遍的问题,但我正在尝试找到处理一个应用程序的最佳方法,该应用程序涉及一个向应用程序分发敏感数据的Web服务器。任何链接、一般信息建议等。。将不胜感激

因为应用程序会在一定时间内存储从数据库检索的持久数据。。一切都变得有些棘手

在设备上存储敏感数据

这在很大程度上取决于你的听众。通常,Android操作系统禁止应用程序通过经验证的Linux文件权限访问彼此的文件(即数据库、首选项文件、存储在应用程序私有目录中的常规文件)。但是,在根设备上,应用程序可以获得根访问权并读取所有内容。需要考虑的几件事:

  1. 如果您知道您的用户没有root用户(例如,如果您不是通过Android Market发布应用程序,而是只在您的公司或类似的地方发布应用程序),您可以简单地依赖Android基于文件系统的安全性
  2. 如果用户确实获得了root访问权限,他将非常小心地将该权限授予哪个应用程序
  3. 如果一个应用程序确实获得了root访问权限,它可能会造成很大的破坏。应用程序中的信息可能是用户最不担心的
  4. 生根导致零保修。包括在应用程序中。你不能为在手机上泄露信息负责

总之,如果你的信息不是超级敏感的复制品(例如信用卡信息),我建议你只使用安卓系统提供的默认安全性(即,将所有内容保存为纯文本,知道其他应用程序无法访问)

否则,加密就是出路。它不是100%安全的(黑客可以对你的应用程序进行反编译,并找出如何解密数据),但它是破解的一大难题,将阻止大多数黑客。特别是如果你用ProGuard之类的东西混淆了你的代码


将敏感数据从服务器传输到设备

你有几个选择。首先,始终使用HTTPS。启用HTTPS后,我将提出两个额外的安全措施:

  1. 使用密钥系统API。在所有请求中包含此API密钥,并在发送任何响应之前在服务器端进行检查。请记住,由于您使用的是HTTPS,攻击者将无法仅使用网络嗅探器来查找您的API密钥。然而,如果有人对你的应用程序进行反编译,这很容易判断出来,这就是为什么你可以进一步混淆它(除了使用ProGuard)。例如,您可以在代码周围将API键分成若干部分(例如作为两个或三个类中的静态成员)。然后,当您发送请求时,您只需连接所有这些部分。您甚至可以应用一些其他类型的转换(例如,位移位),使反编译代码更难理解
  2. 您可以在每次发送请求时生成密钥。该密钥将通过使用一些只有您知道的逻辑来生成,这样您就可以在客户端和服务器端实现它。例如,请求可以包括以下参数:
    time=1321802432&密钥=[生成的密钥]
    其中,generated keytime参数生成。例如:md5(时间+盐)。当服务器收到此请求时,它可以做两件事:

    1. 检查key是否确实等于md5(time+salt)(请注意,只有客户端和服务器知道salt,并且可以与上面的API键类似地对其进行模糊处理),以及
    2. 检查代码>时间>代码>在过去不是太远(例如,如果它在过去1-2分钟以上,考虑请求无效)。

如果您也执行普通HTTP请求,则第二种方法更有用,因为每个人都可以看到发送的参数。而且,要从反编译代码中找出答案要困难得多。尤其是如果将键计算逻辑分散到多个类中

但是,请注意,没有任何东西不可能破解你的应用程序。你可以随心所欲地混淆,如果一个黑客真的下定决心要获取你的数据,他可以通过反编译你的应用程序,花很多不眠之夜浏览你的代码,弄清楚请求是如何形成的。确保数据安全的唯一真正的方法是,除了完成我上面提到的所有工作之外,还向用户索要密码。您无法从反编译代码中获取仅存在于某人(用户)头部的密码:)

发表评论