如何在Android应用程序中安全地存储凭据(密码)?

Noo*_*oor 42 security android

我想存储用于签署我在安全的地方开发的财务应用程序的密码.在做了一些网上冲浪后,我发现了以下选项,但每个选项都有一定的缺点.

1)KeyChain.
仅适用于OS版本4.

2)共享偏好.
它以纯文本形式存储数据,即使我加密数据,也可以通过反编译应用程序代码来破坏加密密钥.

3)访问密钥库守护程序并在其中存储凭据.
(http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html)需要记住另一个密码.

请建议我更好的方法来保护Android应用程序中的凭证信息,如IPhone KeyChain.

Nik*_*kov 17

这与Android目前的iPhone KeyChain并不相同.如果您想保密,请不要将其存储在设备上.或者至少,不要将其加密的密钥/密码存储在设备上.就那么简单.

另外:

1)即使在ICS上,也不能直接使用KeyChain存储应用程序机密(参见3中的博客文章))

2)这对于有根电话只是一个问题,或者如果某人有物理访问设备的话.

3)记住单个密码,保护所有凭据,比试图记住多个密码要好得多.此外,在ICS上,没有单独的密码,凭证存储受设备解锁密码保护.

  • 我知道这是旧的,但在最新的Android主分支中,应用程序的密钥在卸载应用程序时被删除,因此这应该不是问题.话虽如此,界面也发生了很大变化,因此博客中的代码很可能不会像下一个Android版本那样工作(K-whatever). (3认同)
  • 其实我试图破解我自己的应用程序.为此,我开发了另一个具有相同包名的应用程序,并尝试将其安装在我的设备上(此处此新应用程序的签名证书与实际应用程序不同).安装此应用程序后,android给出了一个错误:"已经安装了具有冲突签名的同名现有包".因此,我删除了以前的应用程序并安装了新应用程序.此时,而不是分配新的应用程序android分配了相同的UID,分配给以前的应用程序. (2认同)

Dur*_*n.H 7

散列是解决方案,不会将凭据作为纯文本存储在共享首选项或任何媒体中.

只需加密和哈希密码,然后您可以继续将其存储在sharedPreferences或某些嵌入式数据库中.

下面是它的工作原理:

线上

  1. 成功登录后,将普通(未散列)密码发送到服务器进行身份验证和授权.

  2. 盐可以生成并从服务器返回到客户端,也可以在客户端生成

  3. 然后将其存储为salt并散列密码并存储它.

离线

  1. 我们将使用我们存储的盐来哈希用户输入的密码

  2. 我们将与成功登录时存储的哈希值进行比较

  3. 如果两者相等,那么我们将让用户在其他地方,我们不会让用户进入.

好处:

  1. 所以现在您不必担心版本兼容性.

  2. 即使设备已植根,也很难强制哈希.

  3. 即使有人反编译/破解应用程序,也很难进行逆向工程

  • 通过哈希存储的问题是哈希旨在成为单行道.我相信用户希望存储密码,以便他们可以调用它以防止用户每次都必须登录.加密是一条双向的街道,设计的哈希不是. (2认同)
  • 我不明白这个的好处.如果服务器从预期的密码(然后哈希)更改为期望预先散列的密码,那么如果散列的密码被泄露,黑客可以使用它登录服务器.他们永远不必担心他们拥有服务器认为"密码"的真实密码 (2认同)