如果我想存储要在Android应用程序中使用的用户名和密码,最好的方法是什么?是通过首选项屏幕(但是,如果用户错过了呢?),还是弹出一个对话框并询问用户凭据?如果是这样,我必须维护应用程序的状态。我该怎么做?
如果我想存储要在Android应用程序中使用的用户名和密码,最好的方法是什么?是通过首选项屏幕(但是,如果用户错过了呢?),还是弹出一个对话框并询问用户凭据?如果是这样,我必须维护应用程序的状态。我该怎么做?
Answers:
我见过的大多数Android和iPhone应用程序都使用初始屏幕或对话框来询问凭据。我认为用户不得不经常重新输入他们的姓名/密码很麻烦,因此从可用性的角度来看,存储该信息是有意义的。
(Android开发指南)的建议是:
一般而言,我们建议尽量减少要求用户提供凭据的频率,以使网络钓鱼攻击更加明显,并且不太可能成功。而是使用授权令牌并刷新它。
尽可能不要将用户名和密码存储在设备上。而是使用用户提供的用户名和密码执行初始身份验证,然后使用短暂的,特定于服务的授权令牌。
使用AccountManger是存储凭据的最佳选择。该SampleSyncAdapter提供了如何使用它的一个例子。
如果由于某种原因无法选择此选项,则可以使用“ 首选项”机制退回持久凭证。其他应用程序将无法访问您的首选项,因此用户信息不容易公开。
AccountManager
(按照我的回答,@ Miguel用回旋的方式)并且有人拿走了您的GSM手机,那么他们将需要继续使用您的SIM卡来访问您的帐户,因为这会使存储的凭据无效SIM卡更改时。
您应该使用Android AccountManager。它是针对这种情况而专门设计的。这有点麻烦,但是它的作用之一是,如果SIM卡发生变化,会使本地凭据失效,因此,如果有人轻扫您的手机并向其中扔新的SIM卡,您的凭据将不会受到损害。
这还为用户提供了一种快速简便的方法,使他们可以从一个地方访问(并可能删除)他们在设备上拥有的任何帐户的存储凭据。
SampleSyncAdapter(如提到的@Miguel)是一个使用存储的帐户凭据的示例。
我认为,确保证书安全的最佳方法是,首先考虑将加密的密码存储在account.db文件中,这在非root用户的设备中不易获得,并且在root用户的情况下,黑客必须需要密钥才能解密它。
另一个选择是像Gmail一样进行所有身份验证。在与Gmail服务器进行首次验证之后。您获得了用于密码的身份验证令牌。该令牌将以纯文本存储。如果您从服务器更改密码,则该令牌可能为false。
最后,我建议您为设备启用两因素身份验证并创建设备特定密码。丢失设备后,您只需要禁用该设备即可。
如果您担心将密码以明文形式存储在SharedPreferences中,请查看什么是在Android应用程序中存储用户设置的最合适方法。
您也可以查看SDK 中的SampleSyncAdapter示例。它可能会帮助您。
看一下这篇来自android-developers的帖子,这可能有助于提高Android应用中存储数据的安全性。
随着新(安卓6.0)指纹识别硬件和API,你可以做到这一点在本 GitHub的示例应用程序。
这些以破坏您隐藏信息的难度排序。
以明文形式存储
使用对称密钥存储加密
使用Android Keystore
使用非对称密钥存储加密
密钥库本身是使用用户自己的锁屏PIN /密码加密的,因此,当设备屏幕被锁定时,密钥库将不可用。如果您有可能需要访问您的应用程序机密的后台服务,请记住这一点。
http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html中的信息是一种非常实用的方法,但基于“ uses-hidden-android-apis”。当您真的无法解决在设备上本地存储凭据/密码时,需要考虑一下。
我还在https://gist.github.com/kbsriram/5503519创建了该想法的要点,这可能会有所帮助。