移动应用程序的安全认证

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

  • 机制主义必须依赖独立的商业账户(即链接到谷歌,Facebook或任何其他API不是一种选择。)
  • 该应用程序将在公共商店
  • 像很多移动应用程序(Gmail,Facebook,...)不需要比银行应用程序那么多的安全性,用户必须在首次登录后自动进行身份验证(“记住我”模式)
  • 我发现的:

  • 使用OAuth 2
  • OAuth 2提供称为“刷新令牌”的长时间令牌。 我想使用它的到期日期设置为像一年。

    但是,似乎没有强大的机制来保护这个令牌。 事实上,正如Jamsheed Kamarudeen在回答https://stackoverflow.com/a/7209263/863581时对此提出的评论所述,如果刷新标记,客户端ID和秘密标识被盗(使用嗅探或直接从设备中获取),则攻击者将能够无限制地访问用户帐户...没有任何方式,AFAIK,知道它正在发生。

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

    而且,从我所看到的情况来看,本地存储和Cookie太容易阅读。 这足够了还是应该使用Android / iOS本机安全存储? 即使本地本地存储似乎还不够(https://github.com/phonegap/phonegap/wiki/Platform-Security)。

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

    这是我第一次寻找安全机制,所以也许我误解了一些机制,请让我知道。 但是,我很惊讶地发现找到正确的流程有多困难。 我相信这是所有移动应用程序的经典问题,但我无法找到任何正确的方法来解决这个问题。

    我的问题:正如你上面看到的,我没有找到一种安全的机制来设置网络移动应用上的“自动登录”过程。 我应该怎么设置? 你有没有比我发现给我介绍的其他机制更强大?


    记住我的后果

    您希望拥有“记住我”的要求意味着(没有办法绕过它)客户端将有一些方法来获得连接到服务器和进行身份验证所需的全部内容。

    到OAUTH或不

    OAUTH很好,但如果你不会相信普通的提供者,那么为什么会有所有的开销? 只要让他们一次性在你的网站上选择一个密码,并且不用担心做OAUTH所需的后台和途径。

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

    SSL

    通过嗅探出正确配置的SSL连接来获取凭证:即使银行更为先进的用户担心,也远不止这些。 但是请确实在您的服务器上配置SSL!

    对“记住我”的妥协?

    你能做些什么来改善这种状况:

  • 如果您的服务器注意到浏览器指纹发生变化,您可以使客户端的声明无效,但会话保持不变。 这可能是由于配置错误的代理发生的 - 但是很少有这样的代理。 最坏的情况是用户必须重新登录。

  • 您可以使用IP地址作为GEO位置(国家/地区),并且如果您注意到上次连接发生国家变更而未经重新认证的连接:请不要尊重记住我并要求进行适当的身份验证。

  • 保护cookie

  • 您可以将Cookie存储在浏览器中作为“安全”:这意味着如果浏览器处于https连接状态,浏览器将仅向服务器发送cookie

  • 你也可以设置一个cookie,使其成为httponly:这使得浏览器拒绝从客户端JavaScript访问cookie(并且它会做的就是将其发送到服务器。

  • 您可以同时设置httponly和secure两者...(这就是您想要的)。


  • 无论您最终选择哪种技术解决方案,以下都是正确的:

  • 它不是关于移动应用程序,而是所有的客户端/服务器架构
  • 没有安全风险坚持登录的方式
  • 更安全的方法是在设备上对其进行加密
  • 唯一更好的方式是银行应用程序使用的方式:没有持久性
  • 然而,两个因素sigin也相当安全
  • 这个问题没有绝对的答案,只是在这些考虑和你的应用程序的需求之间作出最佳选择
  • 编辑

    关于加密凭据

    关于对证书进行加密,确实可以读取代码,导致问题不是密码算法,而是要使用的私钥。 如果你想加密证书,你必须实现一个UI,允许用户设置一个shema或PIN码或任何其他秘密来转换私钥来加密然后解密用户凭证。

    但是,如果用户失去了引脚,则需要在服务器端生成新的凭证以重置服务器密码,然后重置客户端密钥客户端。


    一种方法是,你可以存储私钥和令牌加密,然后问题是,存储密钥的地方。 为此,如果您使用的是科尔多瓦,您可以简单地为科尔多瓦制作一个插件并将钥匙存储在那里。 在应用程序开始时,您可以致电科尔多瓦获取钥匙。 由于插件是原生的,所以它会被编译,所以它会给你更多的安全性。

    链接地址: http://www.djcxy.com/p/47949.html

    上一篇: Secure authentication on mobile application

    下一篇: Are refresh tokens necessary for online applications