使用共享首选项进行持久登录,是该漏洞吗?

时间:2012-07-17 08:57:44

标签: android security

最近我发现许多Android应用程序使用共享首选项进行持久登录,这样的应用程序需要用户的用户名和密码才能首次登录,但从那时起,用户不需要其他操作。

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

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

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

3 个答案:

答案 0 :(得分:4)

设备本质上是不安全的,所以不管你做什么,“邪恶的家伙”总会有可能做某事。绝对没有解决方案。 但是,您可以通过执行Chirag Raval建议的方式来降低风险:仅存储登录名及其成功的事实。 我只想在有限时间内“自动”登录,然后再次显示登录对话框以重新确认密码。

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

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

答案 1 :(得分:2)

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

示例:

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

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

Android没有我所知道的更高级的安全措施(我想我读过Android 4.0有新的安全措施,但如果你想让你的应用程序被大多数人使用,你就不能使用目前而且加密是无用的,因为你需要一把钥匙,如果那把钥匙存放在你的移动设备中,那么它也可能被盗。

你可以做的是:告诉别人不要使用他们的Android手机,如果手机被盗,那么只需从其他地方更改密码即可。植根你的手机会增加安全威胁并使任何安全性无效。那个Android就位,所以如果你这样做,你就会暴露自己的数据被盗,因此,只有当你愿意冒险并真正了解你在做什么时才应该这样做。

答案 2 :(得分:0)

  

有一种简单的方法。第一次只是询问用户名和密码   来自用户,如果登录正确,则只将真实标志存储在共享中   偏好。所以,下次你查看国旗,你知道天气   用户已登录或未登录。

     

所以这样没有人可以窃取用户密码。