Android 应用持久认证

Posted

技术标签:

【中文标题】Android 应用持久认证【英文标题】:Android apps persistent authentication 【发布时间】:2014-05-15 19:28:29 【问题描述】:

我最近开始玩弄一个 android 应用程序,我已经到了希望它与 Web 服务通信的地步,我完全理解如何以不安全的方式做到这一点,我有点被绊倒了关于安全性。

我希望它像我手机上的 facebook 应用一样工作,它始终处于登录状态,似乎永远不会过期。

我的第一个想法是使用 User / Pass 并使用 SSL 加密将它们本地保存在手机上。但这可能是一个安全问题,丢失的手机被植根,然后人们可以看到登录并通过(即使它们被散列/加密,这似乎是一个问题)

我的另一个选择是使用 Oauth 1a/2,但如果我没记错的话,这似乎有同样的问题,除了使用 auth 令牌,这意味着除了在 api 层之外会出现同样的问题。

我也研究了 androids accountManager,但我打算为 ios 制作这个,所以我想对两者都使用通用做法。

你们觉得呢?

一般问题:

    刷新 Oauth 令牌与再次登录是一样的,还是只是一个新的 Oauth 令牌?

    有没有办法从手机中获取唯一 ID 以检测“新手机”是否正在使用?

    有谁知道 facebook 或 google 如何在他们的设备上处理他们的身份验证/授权?他们只是简单地存储一个永不过期的身份验证令牌,还是在它到期时发布一个新令牌?

我猜我认为 Android 应用程序似乎很容易受到“如果有人发现一个漏洞可以在没有 root 访问权限的情况下提取身份验证令牌怎么办?”换位思考,我这样想错了吗?

我是否也错误地认为,如果有人获得了我的令牌,唯一会阻止他们通过 api 访问我的帐户的方法是,如果我访问并使用了 api,它会将我的 Oauth 更新为新值以使我的旧值一个过时的? (假设没有可靠的方法来判断哪个设备是哪个)

【问题讨论】:

【参考方案1】:

是的,在设备上存储用户/密码是不可能的。查看this 了解有关令牌如何工作的一些详细信息。

您想要做的是在用户登录后从您的服务器获取一个 OAuth 令牌,将其存储并使用它来签署您的所有请求。如果其他人获得了您的令牌,您可以将其无效,这样他们将无法代表您执行任何更多请求。

关于您的问题:

    使您的令牌失效与您登出类似。刷新(将令牌交换为新令牌)就像再次登录一样。 是的,你可以找到here 我已经在我的应用程序上使用 FB 和 Twitter 实现了身份验证 之前,它的工作方式是,在用户认证后,你会得到一个 短期代币,您可以用它换取长期代币。你 然后将其存储在设备上并用于将来的请求。 更多信息 here。

【讨论】:

好吧,所以 Oauth 的想法并不是在漏洞方面更安全(因为用户/密码也有同样的问题),而是在保护用户的实际用户名和密码,如果它被泄露,您只需更新/使令牌无效。 是的。您不必存储用户凭据,也不必每次打开应用程序时都通过网络传输它们。 看看this answer。您可能会发现它很有帮助。

以上是关于Android 应用持久认证的主要内容,如果未能解决你的问题,请参考以下文章

如何将 android 应用程序数据持久保存到本地 sql server

iOS/Android 上 HTML5 混合应用中持久存储的可靠方法

如何在 Android 应用的 web 视图中使用持久存储

Android - 应用更新后 WebView html5 本地存储不持久

android java:持久登录应用程序

Android应用程序中的全局变量不持久