Android 使用共享首选项进行持久登录,是否存在该漏洞?

Android 使用共享首选项进行持久登录,是否存在该漏洞?,android,security,Android,Security,最近,我发现许多Android应用程序使用共享首选项进行持久登录,这类应用程序需要用户的用户名和密码才能首次登录,但从那时起,不需要用户执行其他操作 在极少数情况下,该应用程序会将密码存储在shared_prefs文件夹的login_account.xml之类的文件中,一旦用户在Android手机上建立了根目录,其他邪恶的应用程序可能会读取该文件以获取用户的密码 在大多数情况下,我发现这些应用程序会在shared_prefs文件夹的login_account.xml中存储一个登录密钥(而不是密码

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

在极少数情况下,该应用程序会将密码存储在shared_prefs文件夹的login_account.xml之类的文件中,一旦用户在Android手机上建立了根目录,其他邪恶的应用程序可能会读取该文件以获取用户的密码

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

我想知道是否有某种方法既能保护我们的用户不被窃取登录密钥,又能不要求我们的用户每次都输入密码来加载我们的应用程序

有一个简单的方法。第一次只需询问用户名和密码 从用户处,如果登录正确,则仅将true标志存储在shared中 偏爱。所以下次你只要看看旗子就知道天气了 用户是否已登录

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


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

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


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

因此,如果在私有模式下正确配置SharedReferences

例如:

    SharedPreferences userDetails = getSharedPreferences("userdetails", MODE_PRIVATE);
应该足以保护您的数据,因为只有您的应用程序才能访问该信息

据我所知,安卓没有更先进的安全措施(我想我在哪里读到安卓4.0有新的安全措施,但如果你想让大多数人使用你的应用程序,你现在就不能使用),加密是无用的,因为你需要一个密钥,如果该密钥存储在你的移动设备中,那么它也可能被盗


你能做的是:告诉人们不要使用Android手机,如果手机被盗,就从其他地方更改密码。在手机上插根会增加安全威胁,并使安卓系统设置的任何“安全”无效,因此如果你这样做,你将面临数据被盗的风险,因此,只有当你愿意冒险并且真正知道自己在做什么时,才应该这样做。

但是如果我在login_account.xml中将用户名更改为其他用户,并将标志修改为true。这是否意味着我可以获得其他用户的登录状态?为什么?如果没有登录密钥之类的东西,应用程序将如何验证用户?正如bitbox所表明的那样,根本没有解决方案。