Android:存储用户名和密码?


177

如果我想存储要在Android应用程序中使用的用户名和密码,最好的方法是什么?是通过首选项屏幕(但是,如果用户错过了呢?),还是弹出一个对话框并询问用户凭据?如果是这样,我必须维护应用程序的状态。我该怎么做?


4
stackoverflow.com/a/786588/1166727了解@RetoMeier(Google Android开发技术负责人)对此有何评论。
tony gil 2012年

1
如果您正在寻找最安全的凭据存储方式。请阅读此答案stackoverflow.com/a/20560574/730807
Durai Amuthan.H 2014年

3
@Legend您如何解决您的问题?
Erum 2015年

@Legend,您能否在加密后在prefs中保存pwd ..因为我希望我的应用程序可以在没有任何互联网的情况下工作,然后如何获取密钥..(因为我无法在设备上存储密钥)
eRaisedToX

您可以将密钥库用于Api +18。developer.android.com/training/articles/keystore
Golnar,

Answers:


115

我见过的大多数Android和iPhone应用程序都使用初始屏幕或对话框来询问凭据。我认为用户不得不经常重新输入他们的姓名/密码很麻烦,因此从可用性的角度来看,存储该信息是有意义的。

Android开发指南)的建议是:

一般而言,我们建议尽量减少要求用户提供凭据的频率,以使网络钓鱼攻击更加明显,并且不太可能成功。而是使用授权令牌并刷新它。

尽可能不要将用户名和密码存储在设备上。而是使用用户提供的用户名和密码执行初始身份验证,然后使用短暂的,特定于服务的授权令牌。

使用AccountManger是存储凭据的最佳选择。该SampleSyncAdapter提供了如何使用它的一个例子。

如果由于某种原因无法选择此选项,则可以使用“ 首选项”机制退回持久凭证。其他应用程序将无法访问您的首选项,因此用户信息不容易公开。


40
我会说按偏好保留密码信息是有风险的。在有根电话上,可以访问应用程序的首选项文件。您至少可以做的是混淆密码。
Jayesh

51
如果有人拥有您的手机并且能够将其植根,那么您将无法做很多事情来保护您的数据安全。混淆密码不是一个坏主意,但实际上并没有增加太多保护。更重要的是,操作系统已经内置了许多安全层。当然,您不想做任何愚蠢的事情来规避这些措施。最好使用OAuth之类的系统,并在设备上存储令牌(而不是用户名和密码)。
埃里克·莱文

4
如果您使用AccountManager(按照我的回答,@ Miguel用回旋的方式)并且有人拿走了您的GSM手机,那么他们将需要继续使用您的SIM卡来访问您的帐户,因为这会使存储的凭据无效SIM卡更改时。
乔恩·奥

3
很早以前就删除了SIP更改上的帐户擦除操作,因为这样做意义不大,尤其是对于拥有多个SIM卡的用户而言。如果您的手机被盗,一个更好的策略是转到您的Google帐户页面并撤消特定设备的访问权限。
Nikolay Elenkov

2
“使用AccountManger是存储凭据的最佳选择。” 为什么?
卢克

9

您应该使用Android AccountManager。它是针对这种情况而专门设计的。这有点麻烦,但是它的作用之一是,如果SIM卡发生变化,会使本地凭据失效,因此,如果有人轻扫您的手机并向其中扔新的SIM卡,您的凭据将不会受到损害。

这还为用户提供了一种快速简便的方法,使他们可以从一个地方访问(并可能删除)他们在设备上拥有的任何帐户的存储凭据。

SampleSyncAdapter(如提到的@Miguel)是一个使用存储的帐户凭据的示例。


3
哪里记录了AccountManager将“如果SIM卡更改则使本地凭据无效”?
埃里克·莱文

不是我知道的。但是,在我的应用程序的某些用户在SIM交换后出现身份验证问题之后,我才开始相信/接受/理解这一点。
乔恩·奥

1
我在JavaDocs或AccountManager代码中看不到它。这听起来像是个不错的功能,但最好先进行验证并了解详细信息。
埃里克·莱文

2
根据@ NikolayElenkov,SIM卡更换功能上的无效功能已被删除。
ThomasW 2014年

2
@ThomasW你为此被引用吗?得到某种确定的答案将是很棒的。
乔恩·奥

8

我认为,确保证书安全的最佳方法是,首先考虑将加密的密码存储在account.db文件中,这在非root用户的设备中不易获得,并且在root用户的情况下,黑客必须需要密钥才能解密它。

另一个选择是像Gmail一样进行所有身份验证。在与Gmail服务器进行首次验证之后。您获得了用于密码的身份验证令牌。该令牌将以纯文本存储。如果您从服务器更改密码,则该令牌可能为false。

最后,我建议您为设备启用两因素身份验证并创建设备特定密码。丢失设备后,您只需要禁用该设备即可。


2
您能张贴一个说accounts.db是加密的消息吗?还是说特定的密码应该加密?
米哈尔ķ

1
@Riz,然后将加密的密钥存储在哪里...因为我的应用无法在没有Internet的情况下工作,所以无法从网络获取它
eRaisedToX




2

随着新(安卓6.0)指纹识别硬件和API,你可以做到这一点在 GitHub的示例应用程序。


8
所引用的示例项目在Android密钥存储区中创建了一个密钥,并使用它来创建用于加密密码的密码。加密的密码和密码在共享首选项中存储为base64编码的字符串。成功进行指纹认证后,将从Android密钥存储区检索秘密密钥,并将其与解码密码一起使用以解密解码密码。
mjwheat 2016年

@mjwheat有助于理解示例中的情况。谢谢!一个小错字:“ ...解密编码的密码。”
muetzenflo

2

这些以破坏您隐藏信息的难度排序

  1. 以明文形式存储

  2. 使用对称密钥存储加密

  3. 使用Android Keystore

  4. 使用非对称密钥存储加密

来源:将密码存储在Android应用中的最佳位置在哪里

密钥库本身是使用用户自己的锁屏PIN /密码加密的,因此,当设备屏幕被锁定时,密钥库将不可用。如果您有可能需要访问您的应用程序机密的后台服务,请记住这一点。

来源:只需使用Android Keystore即可存储密码和其他敏感信息


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.