cordova - 移动应用程序上的安全身份验证

标签 cordova security authentication oauth-2.0 ionic-framework

我正在寻找一种以安全方式对我的移动应用程序用户进行身份验证的方法。移动应用程序是一个纯 JS 应用程序,并且使用 ionic 框架(以及 cordova)。该应用程序只会通过 REST API 与我们的服务器通信。
要求如下:

  • 该机制必须依赖独立的商业帐户(即不能链接到 Google、Facebook 或任何其他 API。)
  • 该应用程序将在公共(public)商店
  • 就像许多不需要银行应用程序那样安全的移动应用程序(Gmail、Facebook 等),用户必须在首次登录后自动进行身份验证(“记住我”模式)

  • 我发现了什么:
  • 使用 OAuth 2

  • OAuth 2 提供称为“刷新 token ”的长时间 token 。我想使用它的有效期设置为一年。

    但是,似乎没有强大的机制来保护该 token 。确实,正如 Jamsheed Kamarudeen 对该答案的评论中提到的那样 https://stackoverflow.com/a/7209263/863581 ,如果刷新 token 、客户端 ID 和 secret ID 被盗(使用嗅探或直接从设备中获取),攻击者将能够无限制地访问用户帐户......没有任何方式,AFAIK,知道它是正在发生。

    嗅探可能很困难,因为显然,所有数据都将通过安全连接 (SSL) 发送,但从我的角度来看,这仍然是可能的,并且必须加以管理。关于第二种攻击,“直接从设备中获取”,我见过的每个解决方案都是关于将数据( token 或 cookie)存储在本地存储或浏览器 cookie 上(例如这篇文章 Using OAuth2 in HTML5 Web App)。即使该帖子中的示例建议存储刷新 token 的哈希值,我也看不出这样做的目的是什么,因为正如 Mati Cicero 的评论所提到的,它不会阻止攻击者能够检索访问 token ,在我的情况下,可以无限制地访问用户的帐户。

    此外,据我所知,localstorage 和 cookies 太容易阅读了。这足够还是我应该使用 Android/iOS 的 native 安全存储?甚至 native 本地存储似乎也不够(https://github.com/phonegap/phonegap/wiki/Platform-Security)。
  • Spring安全性的使用

  • 服务器端将通过 Spring 实现。 Spring-security 提供的机制似乎比 OAuth 2 关于记住我模式 (http://jaspan.com/improved_persistent_login_cookie_best_practice) 更好。但是,据我了解,最终用户将无法在应用程序上登录两次(比如说,它的个人手机和专业手机)。我承认这不是一个大问题,但仍然不完美。最重要的是,最后,我们仍然存在关于 cookie/ token 的存储安全问题。

    这是我第一次寻找安全机制,所以也许我误解了一些机制,请告诉我。
    然而,我真的很惊讶地发现找到正确的过程是多么困难。我确信这是所有移动应用程序上的经典问题,但我找不到任何正确的方法来管理该问题。

    我的问题:正如您在上面看到的,我没有找到一种安全机制来在网络移动应用程序上设置“自动登录”过程。我应该设置什么?除了我发现的介绍我的那些之外,你还有其他机制吗?

    最佳答案

    记住我的后果

    您希望拥有“记住我”的要求意味着(无法绕过它)客户端将有某种方式来获得连接到服务器并进行身份验证所需的一切。

    是否为 OAUTH

    OAUTH 很好,但是如果您不信任公共(public)提供者,那么为什么要承担所有开销呢?
    在这种情况下,只需让他们一次性在您的网站上选择一个密码,不要打扰执行 OAUTH 所需的来回方式。

    话虽如此:为什么不信任 OAUTH 提供商呢?用户信任他们,否则他们不会选择他们,而且很可能他们会在任何地方使用相同的登录名和密码,所以这并不重要。

    SSL

    通过嗅探正确配置的 SSL 连接来获取凭据:您甚至超出了银行等高级用户所担心的范围。但是请务必在您的服务器上正确配置 SSL!

    “记住我”的妥协?

    你可以做些什么来改善这种情况:

  • 如果您的服务器注意到浏览器指纹发生变化,您可以取消客户端声称它已通过身份验证,但 session 保持不变。这可能是由于代理配置不当而发生的 - 但其中很少有。最坏的情况是用户必须再次登录。
  • 您可以将 IP 地址设置为 GEO 位置(例如国家/地区),并且如果您注意到上次连接的国家/地区发生了变化,而没有重新认证连接:不要尊重记住我并要求进行适当的认证。

  • 保护 cookie
  • 您可以将 cookie 存储在浏览器中作为“安全”:这意味着浏览器只会将 cookie 发送到位于 https 连接上的服务器
  • 您还可以将 cookie 设置为 httponly:这会使浏览器拒绝从客户端 javascript 访问 cookie(它所要做的就是将其发送到服务器。
  • 您可以同时设置 httponly 和secure ...(这就是您想要的)。
  • 关于cordova - 移动应用程序上的安全身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379402/

    相关文章:

    security - 如何处理高度不平衡的数据集

    java - Apache Shiro 错误凭据异常

    ios - Cordova 后台 GeoLocation 插件

    javascript - 在应用程序商店中发布后更新 Cordova 应用程序中的 javascript 代码

    java - 在java文件中使用密码安全吗?

    java - 使用 Jhipster 为前端和后端生成集成身份验证

    authentication - 如何从 Joomla 中的时间开始获取登录历史记录?

    android - 更改android webview输入框的光标拖动颜色

    android - Phonegap 指南针插件无法正常工作

    python - 这是 python eval() 的安全使用吗?