我正在寻找一种以安全方式对我的移动应用程序用户进行身份验证的方法。移动应用程序是一个纯 JS 应用程序,并且使用 ionic 框架(以及 cordova)。该应用程序只会通过 REST API 与我们的服务器通信。
要求如下:
我发现了什么:
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-security 提供的机制似乎比 OAuth 2 关于记住我模式 (http://jaspan.com/improved_persistent_login_cookie_best_practice) 更好。但是,据我了解,最终用户将无法在应用程序上登录两次(比如说,它的个人手机和专业手机)。我承认这不是一个大问题,但仍然不完美。最重要的是,最后,我们仍然存在关于 cookie/ token 的存储安全问题。
这是我第一次寻找安全机制,所以也许我误解了一些机制,请告诉我。
然而,我真的很惊讶地发现找到正确的过程是多么困难。我确信这是所有移动应用程序上的经典问题,但我找不到任何正确的方法来管理该问题。
我的问题:正如您在上面看到的,我没有找到一种安全机制来在网络移动应用程序上设置“自动登录”过程。我应该设置什么?除了我发现的介绍我的那些之外,你还有其他机制吗?
最佳答案
记住我的后果
您希望拥有“记住我”的要求意味着(无法绕过它)客户端将有某种方式来获得连接到服务器并进行身份验证所需的一切。
是否为 OAUTH
OAUTH 很好,但是如果您不信任公共(public)提供者,那么为什么要承担所有开销呢?
在这种情况下,只需让他们一次性在您的网站上选择一个密码,不要打扰执行 OAUTH 所需的来回方式。
话虽如此:为什么不信任 OAUTH 提供商呢?用户信任他们,否则他们不会选择他们,而且很可能他们会在任何地方使用相同的登录名和密码,所以这并不重要。
SSL
通过嗅探正确配置的 SSL 连接来获取凭据:您甚至超出了银行等高级用户所担心的范围。但是请务必在您的服务器上正确配置 SSL!
“记住我”的妥协?
你可以做些什么来改善这种情况:
保护 cookie
关于cordova - 移动应用程序上的安全身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379402/