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

44
我希望将用于签入我正在开发的财务应用的密码存储在一个安全的位置。在浏览了一些网站后,我找到了以下选项,但它们每个都有一定的缺点。 1) KeyChain。
仅适用于版本4的操作系统。 2) Shared Preferences。
即使加密数据,它也会以明文形式存储数据,加密密钥可以通过反编译应用程序代码来破解。 3) 访问密钥库守护进程并将凭据存储在其中。
(http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html) 需要记住另一个密码。
请建议我更好的方式来保护Android应用程序中类似iPhone KeyChain的凭据信息。

2
请参考以下链接,了解如何在Android中存储用户名和密码:https://dev59.com/9XI-5IYBdhLWcg3wTWVu - mjn
2个回答

18
目前安卓系统中没有类似iPhone的KeyChain功能。如果您想保密某些内容,请不要将其存储在设备上,或者至少不要将用于加密的密钥/密码存储在设备上。就这么简单。
另外:
1) 即使在ICS上,您也不能直接使用KeyChain来存储应用程序机密(请参见第3篇博客文章)。
2) 这只是对已经取得 root 权限的手机或者有物理接触到设备的人才存在问题。
3) 记住一个密码来保护所有凭据比尝试记住多个密码要好得多。此外,在ICS上,没有单独的密码,凭据存储由设备解锁密码保护。

我决定采取第三个选项。现在我面临的一个问题是密钥库将每个条目与应用程序UID相关联。因此,如果安装另一个与前一个应用程序相同包名称的应用程序(当然,我必须首先删除前一个应用程序),并使用不同的应用程序签名(签名证书),则该应用程序也可以查看密钥库条目,因为UID没有改变。 - Noor
2
实际上我正在尝试破解自己的应用程序。为此,我开发了另一个具有相同包名的应用程序,并尝试在我的设备上安装它(这里新应用程序的签名证书与实际应用程序不同)。在安装此应用程序时,Android 给出了一个错误提示:“已安装具有冲突签名的相同名称的现有包”。因此,我删除了以前的应用程序并安装了新的应用程序。在这一点上,Android 指定了与以前的应用程序分配的相同 UID,而不是分配给新应用程序。 - Noor
这是在哪个设备和 Android 版本上发生的?您确实能够从“新”应用程序中访问密钥吗? - Nikolay Elenkov
我的设备是三星Galaxy S3,Android版本为4.0.4。 - Noor
3
我知道这是旧的内容,但在最新的Android主分支中,应用程序的密钥在应用程序被卸载时会被删除,因此这不应该是一个问题。话虽如此,界面也已经发生了相当大的变化,所以博客中的代码很可能在下一个Android版本(无论是K什么的)中不能直接使用。 - Nikolay Elenkov
显示剩余3条评论

9

哈希化是解决方案,不要将凭据以明文形式存储在共享首选项或任何介质中。

只需对密码进行盐处理和哈希处理,然后即可将其存储在sharedPreferences或某些嵌入式数据库中。

这是它的工作原理:

在线模式

  1. 将明文(未经哈希处理的)密码发送到服务器进行身份验证和授权,登录成功后。

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

  3. 然后将其存储为盐并对密码进行哈希处理,再将其存储。

离线模式

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

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

  3. 如果两者相等,则允许用户进入,否则我们不允许用户进入。

优点:

  1. 现在您无需担心版本兼容性问题。

  2. 即使设备已root,也很难通过暴力破解哈希处理。

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


2
使用哈希存储的问题在于哈希旨在是单向的。我认为用户想要存储密码,以便可以召回它,从而使用户不必每次都登录。加密是双向的,而哈希设计上则不是。 - Derek W
我认为开发人员想要允许用户离线登录。正如你所说,哈希是单向的,无法被反向工程,因此如果哈希匹配,则认证成功,这样非常安全。 - Durai Amuthan.H
1
是的,对于离线身份验证来说,这将是理想的。我将金融应用程序解释为您需要凭据才能通过身份验证来获取信息的Web服务。在您的回答中注明离线方面可能会有益。 - Derek W
1
@RQube - 盐必须是动态的,盐生成逻辑可以由服务器生成,这样反编译应用程序就不会向黑客揭示盐生成逻辑。 - Durai Amuthan.H
3
我不理解这样做的优点。如果服务器从期望密码(然后对其进行哈希)更改为期望预先哈希的密码,那么如果哈希密码被泄露,黑客就可以使用它登录服务器。他们永远不必担心真正的密码是什么,因为他们已经获得了服务器认为的“密码”。 - Richard Tingle
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接