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

DJP*_*yer 67 security android

是的,这是一个非常普遍的问题,但我正在试图找到一种最好的方法来处理触及基础的应用程序,该应用程序将敏感数据分发到应用程序.任何链接,一般信息建议等..将不胜感激.

由于应用程序将存储从数据库中恢复的持久数据一段时间......所有内容都变得有些敏感.

Fel*_*lix 101

在设备上存储敏感数据

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

  1. 如果您知道您的用户不会拥有root用户(例如,如果您不通过Android Market分发应用程序,但仅限于您的公司,或类似的东西),您可以简单地依赖Android的基于文件系统的安全性.
  2. 如果用户确实获得了root访问权限,那么他会非常小心他给予的特权应用程序
  3. 如果一个应用程序确实获得root访问权限,它可能会造成很大的破坏.您应用中的信息可能是用户最不担心的问题.
  4. 生根导致零保修.包括在应用程序中.您不能对在有根电话上泄露信息负责.

总而言之,如果您的信息不是超级敏感的(例如信用卡信息),我建议您坚持使用Android提供的默认安全性(即以纯文本保存所有内容,知道其他应用无法访问它).

否则,加密是可行的方法.这不是100%安全(黑客可以解组你的应用程序并弄清楚如何解密数据),但这是一个很大的痛苦,破解并将阻止大多数黑客.特别是如果你用ProGuard之类的东西混淆你的代码.


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

你有几个选择.首先,始终使用HTTPS.启用HTTPS后,我建议采取两种额外的安全措施:

  1. 使用API​​密钥系统.在所有请求中包含此API密钥,并在发送任何响应之前在服务器端进行检查.请记住,由于您使用的是HTTPS,攻击者无法使用网络嗅探器来查找您的API密钥.但是,如果有人反编译您的应用程序,这很容易理解,这就是为什么您可以进一步混淆它(除了使用ProGuard).例如,您可以将API密钥分解为代码周围的部分(例如,作为两个或三个类中的静态成员).然后,当您发送请求时,您只需连接所有这些部分.您甚至可以应用其他类型的转换(例如位移),以便更难以从反编译代码中找出.
  2. 您可以在每次发送请求时生成密钥.该密钥将通过使用只有您知道的一些逻辑生成,以便您也可以在客户端和服务器端实现它.例如,请求可以包括以下参数:
    time=1321802432&key=[generated-key]
    其中generated-key是从所生成的time参数.例如:md5(time + salt).当服务器收到此请求时,它可以做两件事:
    1. 检查key确实等于md5(time + salt)(注意只有客户端和服务器知道salt,并且它可以与上面的API密钥类似地进行模糊处理),并且
    2. 检查time过去不是太远了(例如,如果过去超过1-2分钟,请认为请求无效).

如果您还在进行纯HTTP请求,则第二种方法更有用,每个人都可以看到正在发送的参数.而且,从反编译代码中找出它要困难得多.特别是如果您将键计算逻辑分布在多个类中.

请注意,没有什么能够破解你的应用程序.您可以根据需要进行模糊处理,如果黑客真的决心获取您的数据,他将能够通过反编译您的应用程序并花费许多不眠之夜通过您的代码并弄清楚请求是如何形成的.保护数据的唯一真正方法是向用户提供密码,除了完成我上面写的所有工作.您无法从反编译代码中获取仅存在于某人(用户)头部的密码.


Joe*_*nte 13

(来自Google搜索)

我最近一直在研究这个问题,感谢Google和Bing的搜索,这个页面已经出现了很多.用于安全地在设备上存储数据的广泛接受的过程是使用诸如AES的强加密算法.更难的问题是"AES需要一个安全的密钥.你用钥匙做什么?"

谷歌最近发布了针对应用程序的基于云的存储解决方案,因此如果情况允许,您可以考虑将密钥存储在那里.否则,它似乎在服务器之外获取密钥更好.如果您可以让用户打入PIN,那实际上效果最好.您可以进行密码派生以存储密码,您可以重做派生以验证密码

没有"用户在PIN中打孔"部分,我没有找到很多这个问题的好答案.但是,如果您必须使用APP存储一个,请不要使用密钥.至少,使用安全密码生成器和/或类似PBKDF2(基于密码的派生函数2)的派生函数生成密钥.

如果我正确阅读帖子,谷歌确实说过一种方法是在应用程序第一次启动时生成密钥,通过MODE_PRIVATE标志将密钥存储到许多文件I/O操作中,并将其用作密钥.您还可以基于该主密钥导出其他密钥,而NIST实际上也会根据这些内容提出建议.

无论是否信任主密钥方法,我都会留给您.此密钥将在root设备上公开.我也承认我还在研究这个问题

  • 有运气吗? (2认同)