安卓系统中是否有类似于iOS钥匙串的用户凭证存储方式?

86

在安卓系统中是否有类似于iOS Keychain的功能?

我的理解是,Preferences API不具备加密功能。对于我的应用程序,这些凭据是否在设备之间持久化并不重要(即与安卓中的iPhone Keychain相比,使用场景不同)

我还研究了KeyStore API,但它似乎将用户凭据的实际存储留给了应用程序开发人员。

4个回答

10

简短回答,没有唯一的方法。但您可以期望文件系统是安全的。

每个应用程序都在不同的用户下运行,并且用于存储应用程序数据的文件系统受普通的UNIX用户权限保护。因此,默认情况下,每个应用程序的文件访问都是沙箱化的。文件系统也可以加密。

来自开发者网站的此页面更好地解释了此问题:http://developer.android.com/guide/topics/security/security.html


19
当您在iOS设备上使用密码或PIN码锁定时,它们将用作私钥的一部分。这个6分钟黑客攻击只适用于未锁定的设备。 - Heath Borders
4
当用户更改iOS密码时会发生什么?它会对钥匙串进行加/解密操作吗? - Jeffrey Blattman
7
每个 iOS 系统也都运行在自己的沙盒中。因此,UNIX 用户分离并不是借口。权限分离对于一个加密存储来说并非替代方案! - miho
2
如何在用户卸载并重新安装应用程序时,在Android上保留密钥? - Super Engineer
下面有一个关于SmartLock的答案(这是正确的答案)。 - Guillaume Laurent

6
实际上,有这个功能:
通过将智能锁密码集成到您的Android应用程序中,您可以使用用户保存的凭据自动为用户签入您的应用程序。用户可以保存用户名和密码凭据以及联合身份提供者凭据。
使用凭据API检索已保存的凭证以进行登录并将已成功检索的凭证用于用户登录,或使用凭据API在部分完成应用程序的注册或登录表单时快速接收新用户。提示用户在登录或注册后存储他们的凭证以供将来自动验证。 https://developers.google.com/identity/smartlock-passwords/android/

3
此 API 并不真正方便存储任意的 OAuth 令牌等信息。它似乎更提供了一种让用户登录您的应用程序的方式。对于那些提供安全接入其他服务的应用程序来说,它并没有什么用处。它并没有真正回答原始问题。 - yano
你可以从不同的角度来看待它。如果你只能存储用户和密码,为什么不只持久化这些信息并将令牌仅保留在内存中。每当应用程序重新启动时,它会重新进行身份验证。虽然不是最好的方法,但目前似乎是最安全的方式。 - neteinstein
1
我会重申,“这不是等价或适当的方法”来完成这样的任务。智能锁相当于浏览器中的“保存凭据/密码”。您可以在移动应用程序和反之亦然中使用在浏览器中保存的“用户名/密码”。此外,该库需要Google Play服务,这对于所有设备来说都不可行。 - Jemshit Iskenderov
这完全是错误和不同的,我很担心。 - Fattie

4

以下是对 @DJPlayer 答案的进一步阐述:

一些相关文章。第三篇包括一个 Github 应用程序,演示了如何使用密钥库提供程序生成密钥,然后加密字符串。

此外,查看Android 存储选项以了解存储加密密码的方式 - 我的建议是使用共享首选项。

请注意,根据第二篇文章,如果具有 root 访问权限并且知道应用程序如何使用密钥库(可能可以从反编译 apk 中获得),则可以劫持私钥并将其用于解密加密材料(例如,持久化的密码)。


1
对于第三篇文章,一旦生成密钥并用于加密明文,那么加密后的字符串存储在哪里? - Android Noob

-3

43
这似乎只存储密钥和证书,不包括用户凭据,而这正是提问者感兴趣的内容。 - Sixten Otto
3
你可以使用某个密钥对用户凭据进行加密,并将该密钥存储在钥匙串中。当然,还有更多的工作需要完成,但是这是可行的。 - Dmitry Zaytsev
@DmitryZaytsev,你在2014年提出的建议现在已经在Jetpack安全库中实现了:D - Jemshit Iskenderov
2
@JemshitIskenderov 哈哈,不错。只用了6年 :D - Dmitry Zaytsev

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