4

最近我发现许多Android应用程序使用共享首选项进行持久登录,此类应用程序需要用户提供用户名和密码才能首次登录,但此后不需要用户进行任何其他操作。

在极少数情况下,该应用程序会将密码存储在 shared_prefs 文件夹的 login_account.xml 等文件中,一旦用户 root 了他的 Android 手机,其他恶意应用程序可能会读取此文件以获取用户的密码。

在大多数情况下,我发现应用程序会在 shared_prefs 文件夹的 login_account.xml 中存储登录密钥(不是密码),这似乎是安全的,因为恶意应用程序无法窃取密码。但是它仍然可以获取受害者的登录状态,因为他可以用受害者的登录密钥替换他的登录密钥。

我想知道是否有某种方法既可以保护我们的用户免受登录密钥被盗,又不需要我们的用户每次都输入他的密码来加载我们的应用程序

4

3 回答 3

5

设备本质上是不安全的,所以无论你做什么,“邪恶的家伙”总是有可能做某事。绝对没有解决办法。但是,您可以按照 Chirag Raval 的建议在一定程度上降低风险:仅存储登录名和登录成功的事实。我会在有限的时间内添加到仅“自动”登录,然后再次显示登录对话框以重新确认密码。

您可以通过生成手机的签名,在第一次登录时发送它并让服务器发送一个响应字符串来使其更安全一些,您可以使用该字符串随后登录。它会有点安全,因为它很难猜到,它不能在另一部手机上工作,而且它仍然需要密码。为了生成这样的签名,我将连接来自 Build 类的大量字段值、电话的 id 以及可能在 TelephonyManager(家庭网络)中获得的值,然后从中生成摘要。最安全的方法是使用 SHA-1 HMAC(查看 Bouncy castle 库)。

当然,这一切都与一个专门的对手无关:他可以将调试器附加到您的应用程序,跟踪其所有调用并找出签名算法。那是因为正如我在顶部所写的那样,该设备是不安全的。(PS:当客户测试应用程序的安全性时,这实际上发生在我身上)。

于 2012-07-17T09:12:19.450 回答
2

所以 SharedPreferences,如果在私有模式下正确配置

例子:

    SharedPreferences userDetails = getSharedPreferences("userdetails", MODE_PRIVATE);

应该足以保护您的数据,因为只有您的应用程序才能访问该信息。

Android 没有我所知道的更高级的安全措施(我想我在某处读到 Android 4.0 有新的安全措施,但如果你想让你的应用程序被大多数人使用,你现在不能使用它)和加密没用,因为您需要密钥,如果该密钥存储在您的移动设备中,那么它也可能被盗。

您可以做的是:告诉人们不要 Root 他们的 Android 手机,如果手机被盗,那么只需从其他地方更改密码。扎根手机会增加安全威胁,并使 Android 设置的任何“安全性”失效,因此,如果您这样做,就会使自己面临数据盗窃的风险,因此,只有在您愿意冒险并且真正了解自己的情况时才应该这样做是做。

于 2012-07-17T09:13:00.333 回答
0

有一种简单的方法。第一次只需询问用户的用户名和密码,如果登录正确,则仅将 true 标志存储在共享首选项中。因此,下次您只需检查标志,您就会知道用户已经登录或未登录的天气。

所以这种方式没有人可以窃取用户密码。

于 2012-07-17T09:02:11.413 回答