是的,这是一个非常普遍的问题,但是我正在尝试一种最佳方式来处理与基础服务器/向敏感应用程序分发敏感数据的网络服务器相关的应用程序。任何链接,一般信息建议等。
由于该应用程序将存储从数据库中检索到的持久性数据达一定时间,所以一切都变得有些棘手。
是的,这是一个非常普遍的问题,但是我正在尝试一种最佳方式来处理与基础服务器/向敏感应用程序分发敏感数据的网络服务器相关的应用程序。任何链接,一般信息建议等。
由于该应用程序将存储从数据库中检索到的持久性数据达一定时间,所以一切都变得有些棘手。
Answers:
这在很大程度上取决于您的听众。通常,Android OS禁止应用程序通过经过验证的Linux文件权限来访问彼此的文件(即数据库,首选项文件,存储在应用程序私有目录中的常规文件)。但是,在具有root用户权限的设备上,应用程序可以获取root用户访问权限并读取所有内容。需要考虑的几件事:
总而言之,如果您的信息不是超级敏锐的信息(例如信用卡信息),我建议您坚持使用Android提供的默认安全性(即,将所有内容保存为纯文本格式,因为其他应用程序无法访问它)。
否则,加密是必经之路。它不是100%安全的(黑客可以反编译您的应用程序并弄清楚如何解密数据),但这是破解的主要难题,它将阻止大多数黑客。特别是如果您使用ProGuard之类的代码来混淆您的代码。
您在这里有一些选择。首先,始终使用HTTPS。启用HTTPS之后,我将建议以下两项额外的安全措施:
time=1321802432&key=[generated-key]
generated-key
是从所生成的time
参数。例如:md5(time + salt)
。服务器收到此请求后,可以执行以下两项操作:
key
是否确实等于md5(time + salt)
(请注意,只有客户端和服务器才知道盐,并且可以像上面的API密钥一样对其进行混淆),并且time
过去是否太远(例如,如果过去超过1-2分钟,则认为请求无效)。如果您也在执行普通的HTTP请求,每个人都可以看到正在发送的参数,则第二种方法会更有用。而且,从反编译的代码中找出要困难得多。特别是如果您将密钥计算逻辑分布在多个类中。
但是,请注意,没有什么可以破解您的应用程序的。您可以根据自己的意愿进行任意程度的混淆,如果黑客真的下定决心要获取您的数据,那么他可以通过反编译您的应用程序并花费许多不眠之夜来遍历您的代码并弄清楚请求的形成方式来做到这一点。保护数据的唯一真正方法是,除了完成我上面写的所有工作之外,还要求用户提供密码。您无法从反编译代码中获得仅存在于某人(用户)头中的密码:)。
(感谢Google搜索,请点击此处)
最近,我一直在对此进行大量研究,由于有了Google和Bing搜索,该页面的内容也很多。安全地在设备上存储数据的广泛接受的过程是使用诸如AES之类的强大加密算法。较难的问题是“ AES需要安全密钥。您如何使用密钥?”
Google最近宣布了针对应用程序的基于云的存储解决方案,因此,在情况允许的情况下,您可以考虑在其中存储密钥。否则,将密钥移到设备外部(例如在服务器上)似乎更好。如果您可以让用户输入PIN码,那实际上将是最好的。您可以进行密码派生以便存储密码,也可以重做派生以验证密码
如果没有“用户输入PIN码”部分,那么我就找不到很多很好的答案。但是,如果必须在应用程序中存储一个密钥,请不要对密钥进行硬编码。至少要使用安全密码生成器和/或派生功能(如PBKDF2)(基于密码的派生功能2)来生成密钥。
如果我没看错文章,Google确实说过一种方法是在应用程序首次启动后生成密钥,然后通过MODE_PRIVATE标志将密钥存储到许多文件I / O操作中,并将其用作密钥。您还可以基于该主密钥派生其他密钥,而NIST实际上会建议一些类似的东西。
无论您是否信任主密钥方法,我都会交给您。该密钥将在有根设备上公开。我也承认我仍在研究这个问题
Android上的每个应用程序都在安全的沙箱环境中运行,因此如果没有适当的握手,系统上的其他进程将无法访问您的代码或私有数据。但是,由于应用程序的不良设计,仍然可能存在许多漏洞。Android开发人员网站的此链接为您提供了一些安全方面的好技巧-https: //developer.android.com/training/articles/security-tips.html
如果您想确保用户只能通过查看您的应用程序看到其他数据,那么加密实际上是唯一的方法。如果设备已植根,则用户甚至也可以访问“受保护”的存储。甚至加密也不是完全安全的,因为您需要在某个时候解密数据才能显示它。您将劝说随意的浏览器,但不会劝诱坚定的黑客。
在HTTPS上使用SSL而不是HTTP来传输数据,您需要在Web服务器上设置证书,但不确定其工作方式。
如果您真的很担心数据,请在发送数据并到达应用程序之前对其进行解密,然后再使用独特的算法对其进行加密。我想就是这样。除非您需要真正强大的功能,否则请基于TCP开发自己的协议和/或使用其他端口。
http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/ android-and-self-signed-ssl-certificates /
至于在应用程序中存储数据,您可以在存储之前对数据进行加密,或者可以使用SQLite以外的其他格式来提高安全性,因为您可以使用浏览器轻松查看sqlite数据库。
除非手机扎根,否则应该没有办法从手机中提取数据。