我正在创建一个使用用户名/密码连接到服务器的应用程序,我想启用“保存密码”选项,这样用户就不必在每次应用程序启动时输入密码。

我试图用共享偏好来做,但不确定这是否是最好的解决方案。

我很感激任何关于如何在Android应用程序中存储用户值/设置的建议。


当前回答

我使用Android KeyStore在ECB模式下使用RSA加密密码,然后将其保存在SharedPreferences中。

当我想要回密码时,我从SharedPreferences中读取加密的密码,并使用KeyStore对其解密。

使用这个方法,你可以生成一个公共/私有密钥对,其中私有密钥对由Android安全存储和管理。

这里有一个关于如何做到这一点的链接:Android KeyStore教程

其他回答

一般来说,SharedPreferences是存储首选项的最佳选择,所以一般来说,我推荐使用这种方法来保存应用程序和用户设置。

这里唯一需要关注的是你节省了什么。存储密码总是一件很棘手的事情,我对以明文形式存储密码特别谨慎。Android架构是这样的,你的应用程序的SharedPreferences是沙盒的,以防止其他应用程序能够访问这些值,所以有一些安全性,但对手机的物理访问可能允许访问这些值。

如果可能的话,我会考虑修改服务器,使用协商的令牌来提供访问,比如OAuth。或者,您可能需要构造某种加密存储,尽管这不是简单的。至少,要确保在将密码写入磁盘之前对其进行了加密。

我将加入这个圈子,只是为了谈谈在Android上保护密码的一般问题。在Android上,设备二进制文件应该被认为是被破坏的——这对于任何终端应用程序都是一样的,因为它是直接由用户控制的。从概念上讲,黑客可以使用对二进制文件的必要访问来反编译它,并找出你的加密密码等等。

因此,如果安全是你主要关注的问题,我想提出两个建议:

1)不要保存实际密码。存储已授予的访问令牌,并使用该访问令牌和话机的签名对会话服务器端进行认证。这样做的好处是,您可以使令牌有一个有限的持续时间,您不会损害原始密码,并且您有一个很好的签名,您可以使用它来关联以后的流量(例如检查入侵尝试和使令牌无效,使其无用)。

2)利用2因素认证。这可能更令人讨厌和侵入,但在某些合规情况下是不可避免的。

我使用Android KeyStore在ECB模式下使用RSA加密密码,然后将其保存在SharedPreferences中。

当我想要回密码时,我从SharedPreferences中读取加密的密码,并使用KeyStore对其解密。

使用这个方法,你可以生成一个公共/私有密钥对,其中私有密钥对由Android安全存储和管理。

这里有一个关于如何做到这一点的链接:Android KeyStore教程

您需要使用sqlite,安全工具来存储密码。 下面是最好的例子,它存储密码——passwordsafe。 这是来源和解释的链接 http://code.google.com/p/android-passwordsafe/

首先,我认为用户的数据不应该存储在手机上,如果必须将数据存储在手机上的某个地方,它应该在应用程序的私有数据中加密。用户凭证的安全性应该是应用程序的优先级。

敏感数据必须安全存储,否则就不存储。在设备丢失或恶意软件感染的情况下,不安全存储的数据可能会受到损害。