移动应用程序的安全认证

Séb*_*ZAT 18 security authentication oauth-2.0 cordova ionic-framework

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

  • 机制必须依赖于独立的企业帐户(即不能选择链接到谷歌,Facebook或任何其他API.)
  • 该申请将在公共商店
  • 像许多移动应用程序(Gmail,Facebook,...)一样,它不需要比银行应用程序更多的安全性,用户必须在首次登录后自动进行身份验证("记住我"模式)

我发现了什么:

  • 使用OAuth 2

OAuth 2提供称为"刷新令牌"的长时间令牌.我想使用它的过期日期设置为一年.

然而,似乎没有强大的机制来保护这个标记.事实上,正如Jamsheed Kamarudeen对该答案的评论/sf/answers/504648441/所述,如果刷新令牌,客户端ID和秘密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 /令牌的存储安全问题.

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

我的问题:正如您在上面所看到的,我没有找到一个安全的机制来在Web移动应用程序上设置"自动登录"过程.我该怎么设置?你有其他机械主义,而不是我发现的那些吗?

小智 5

记住我的后果

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

OAUTH 与否

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

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

安全证书

通过从正确配置的 SSL 连接中嗅探获取凭据:您已经超出了像银行这样的更高级用户所担心的范围。但是请务必在您的服务器上正确配置 SSL!

“记住我”的妥协?

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

  • 如果您的服务器注意到浏览器指纹发生变化,您可以使客户端声称它已通过身份验证无效,但会话保持不变。这可能是由于配置不当的代理而发生的 - 但其中很少有人存在了。最坏的情况是用户必须再次登录。

  • 您可以将 IP 地址用于 GEO 位置(例如国家/地区),并且如果您注意到上次连接中的国家/地区发生了变化而没有重新进行身份验证:请不要记住我并要求进行适当的身份验证。

保护 cookie

  • 您可以将 cookie 存储在浏览器中作为“安全”:这意味着浏览器只会将 cookie 发送到服务器,如果它是在 https 连接上

  • 您还可以将 cookie 设置为 httponly:这会使浏览器拒绝从客户端 javascript 访问 cookie(它所做的就是将其发送到服务器。

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


Rém*_*ras 2

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

  • 它与移动应用程序无关,涉及所有客户端/服务器架构
  • 没有办法在没有安全风险的情况下保持登录
  • 更安全的方法是在设备上对其进行加密
  • 唯一更好的方法是银行应用程序使用的方式:没有持久性
  • 然而,两因素登录也非常安全
  • 这个问题没有绝对的答案,只是在这些考虑因素和您的应用程序的需求之间做出最佳选择

编辑

关于加密凭证

关于加密凭证,确实可以读取代码,因为问题不在于加密算法,而在于要使用的私钥。如果要加密凭据,则必须实现一个 UI,允许用户设置 shema 或 pin 代码或任何其他秘密以转换为私钥以加密然后解密用户凭据。

但是,如果用户丢失了 PIN,则需要在服务器端生成新的凭据以重置服务器密码,然后重置客户端密码。