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

标签 android security

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

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

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

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

最佳答案

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

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

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

关于android - 使用共享首选项进行持久登录,是漏洞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11519154/

相关文章:

android - IntentService 错误 : No default Constructor

android - 如何解决不同范围的绑定(bind)?

php - 在安全隔离的 LAMP 上运行多个站点

security - http和https的区别

javascript - 如何隐藏用Javascript编写的敏感数据?

java - WebView 电话 : open chooser telephone or sms

android - 如何将额外数据传递给 fragment 类以及如何在 fragment 中获取该数据?

android - 如何从 Sqlite 获取最后一条记录?

security - 如何在 Java EE 7 中保护 Websocket 服务器

java - Java 安全管理器的使用