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

保护Android应用程序敏感数据的最佳方法?,android,security,Android,Security,是的,这是一个相当普遍的问题,但我正在尝试找到处理一个应用程序的最佳方法,该应用程序涉及一个向应用程序分发敏感数据的Web服务器。任何链接、一般信息建议等。。将不胜感激 因为应用程序会在一定时间内存储从数据库检索的持久数据。。一切都变得有些棘手 如果你想确保用户除了查看你的应用程序之外看不到数据,那么加密确实是唯一的方法。即使是“受保护”的存储,如果设备是根设备,用户也可以访问。即使是加密也不是完全安全的,因为您需要在某个时刻解密数据以显示它。您将劝阻随意的浏览器,但不会劝阻坚定的黑客。使用HT

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


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

如果你想确保用户除了查看你的应用程序之外看不到数据,那么加密确实是唯一的方法。即使是“受保护”的存储,如果设备是根设备,用户也可以访问。即使是加密也不是完全安全的,因为您需要在某个时刻解密数据以显示它。您将劝阻随意的浏览器,但不会劝阻坚定的黑客。

使用HTTPS上的SSL传输数据,而不是HTTP。您需要在Web服务器上设置证书,但不太清楚它是如何工作的

如果你真的关心这些数据,那么在发送之前,用一种独特的算法对其进行进一步加密,并在数据到达应用程序时对其进行解密。我想就这些了。。除非您需要非常强大的功能,否则请基于TCP开发您自己的协议和/或使用其他端口。。也许那会有帮助

http://developer.android.com/reference/javax/net/ssl/package-summary.html

至于在应用程序中存储数据,您可以在存储数据之前对数据进行加密,或者可以使用SQLite以外的其他格式以提高安全性,因为您可以非常轻松地使用浏览器查看SQLite数据库

除非手机是根目录,否则不应该有办法从中提取数据

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

  • 如果您知道您的用户没有root用户(例如,如果您不是通过Android Market发布应用程序,而是只在您的公司或类似的地方发布应用程序),您可以简单地依赖Android基于文件系统的安全性
  • 如果用户确实获得了root访问权限,他将非常小心地将该权限授予哪个应用程序
  • 如果一个应用程序确实获得了root访问权限,它可能会造成很大的破坏。应用程序中的信息可能是用户最不担心的
  • 生根导致零保修。包括在应用程序中。你不能为在手机上泄露信息负责
  • 总之,如果你的信息不是超级敏感的复制品(例如信用卡信息),我建议你只使用安卓系统提供的默认安全性(即,将所有内容保存为纯文本,知道其他应用程序无法访问)

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


    将敏感数据从服务器传输到设备 你有几个选择。首先,始终使用HTTPS。启用HTTPS后,我将提出两个额外的安全措施:

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

    其中,
    generated key
    time
    参数生成。例如:
    md5(时间+盐)
    。当服务器收到此请求时,它可以做两件事:
  • 检查
    key
    是否确实等于
    md5(time+salt)
    (请注意,只有客户端和服务器知道salt,并且可以与上面的API键类似地对其进行模糊处理),以及
  • 检查<>代码>时间>代码>在过去不是太远(例如,如果它在过去1-2分钟以上,考虑请求无效)。 如果您也执行普通HTTP请求,则第二种方法更有用,因为每个人都可以看到发送的参数。而且,要从反编译代码中找出答案要困难得多。尤其是如果将键计算逻辑分散到多个类中

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

    (多亏了谷歌搜索,才能获得此密码)

    我已经研究这个很久了