Twitter通过支持他们所称的变体来解决oAuth中的外部应用程序问题 XAUTH 。不幸的是,已有大量其他具有此名称的方案,因此可能会让人感到困惑。
协议 是 oAuth,除了它跳过请求令牌阶段,并在收到用户名和密码后立即发出访问令牌对。 (开始于 这里是E步 。) 这个 初始 请求和回复 的 必须得到保障 强> - 它以明文形式发送用户名和密码,并接收访问令牌和秘密令牌。一旦配置了访问令牌对,初始令牌交换是通过oAuth模型还是xAuth模型与会话其余部分的客户端和服务器无关。这样做的好处是,您可以利用现有的oAuth基础架构,并为移动/ Web /桌面应用程序提供几乎相同的实现。主要的缺点是应用程序被授予访问客户端用户名和密码的权限,但看起来您的要求强制要求这种方法。
在任何情况下,我都同意你的直觉以及其他几个回答者的直觉:不要试图从头开始构建新东西。安全协议可以很容易地启动,但总是很难做到,并且它们变得越复杂,第三方开发人员就越不可能实现它们。您的假设协议非常类似于o(x)Auth - api_key / api_secret,nonce,sha1哈希 - 但是您可以使用许多现有库中的一个,而您的开发人员将需要自己编写这些库。
这是一个很多问题,我想很多人没有设法一直读到最后:)
我对Web服务身份验证的体验是,人们通常会过度使用它,而且问题只与您在网页上遇到的问题相同。可能非常简单的选项包括登录步骤的https,返回令牌,要求将其包含在将来的请求中。您还可以使用http基本身份验证,只需传递标题中的内容即可。为了增加安全性,请经常旋转/过期令牌,检查请求是否来自同一个IP块(这可能会因为移动用户在小区之间移动而变得混乱),与API密钥或类似组合。或者,在对用户进行身份验证之前,执行oauth的“请求密钥”步骤(有人在之前的回答中建议这一点并且这是一个好主意),并将其用作生成访问令牌的必需密钥。
我还没有使用的另一种选择,但我听说过很多关于oAuth的设备友好替代方案 XAUTH 。看看它,如果你使用它,那么我真的很想知道你的印象是什么。
对于散列,sha1稍微好一点,但不要挂断它 - 无论设备如何轻松(并且在性能意义上很快)实现可能都没问题。
希望有所帮助,祝你好运:)
我正在考虑在我的项目中执行此登录部分的方式是:
在登录之前用户请求a login_token 从服务器。这些是根据请求生成并存储在服务器上的,并且可能具有有限的生命周期。
login_token
登录应用程序计算用户密码的哈希值,然后用密码哈希密码 login_token 为了得到一个值,他们然后返回两个 login_token 和组合哈希。
服务器检查 login_token 是它生成的一个,将其从有效列表中删除 login_token 秒。然后,服务器将其存储的用户密码的哈希值与 login_token 并确保它与提交的组合令牌匹配。如果匹配,则表示您已对用户进行身份验证。
这样做的好处是你永远不会将用户的密码存储在服务器上,密码永远不会以明文形式传递,密码哈希只会在明确的帐户创建中传递(虽然可能有办法解决这个问题),它应该是安全的重播攻击作为 login_token 在使用时从数据库中删除。
那么你所追求的是某种服务器端认证机制,它将处理移动应用程序的身份验证和授权方面?
假设是这种情况,那么我会按如下方式处理它(但只是'我是Java开发人员所以C#的人会以不同的方式做到这一点):
的 RESTful身份验证和授权服务 强>
的 客户端安全库/应用程序 强>
那么现在30,000英尺的视图已经完成了你怎么去做呢?嗯,使用浏览器客户端在服务器端基于列出的技术创建身份验证和授权系统并不困难。与HTTPS结合使用时,框架将基于由身份验证过程生成的共享令牌(通常表示为cookie)提供安全过程,并在用户希望执行某些操作时使用。无论何时发生任何请求,客户端都会将此令牌呈现给服务器。
对于本地移动应用程序,似乎您正在执行以下操作的解决方案:
不管你做什么, 的 不要试图发明自己的安全协议 强> ,或默默无闻地使用安全措施。你永远无法为此编写一个比当前可用且免费的算法更好的算法。此外,人们相信众所周知的算法。因此,如果您说安全库使用SSL,HTTPS,SpringSecurity和AES加密令牌的组合为本地移动应用程序提供授权和身份验证,那么您将立即在市场中获得信誉。
希望这会有所帮助,并祝你好运。如果您想了解更多信息,请告诉我 - 我已经编写了很多基于Spring Security,ACL等的Web应用程序。
超级晚会,但我想为任何对此问题感兴趣的人提出一些额外的要点。我为一家从事移动API安全解决方案的公司工作( approov 所以整个区域肯定与我的兴趣相关。
首先,尝试保护移动API时要考虑的最重要的事情是 的 多少值得你 强> 。银行的正确解决方案不同于为了娱乐而做某事的人的正确解决方案。
在建议的解决方案中,您提到至少需要三个参数:
这意味着对于某些API调用,不需要用户名/密码。这对于您不想强制登录的应用程序非常有用(例如,在在线商店中浏览)。
这与用户身份验证的问题略有不同,更像是软件的身份验证或证明。没有用户,但您仍希望确保您的API没有恶意访问权限。因此,您使用API密钥对流量进行签名,并将访问API的代码标识为正版。这个解决方案的潜在问题是你必须在每个版本的应用程序中泄露秘密。如果有人可以提取秘密,他们可以使用您的API,冒充您的软件,但做任何他们喜欢的事情。
为了应对这种威胁,根据数据的价值,你可以做很多事情。 的 困惑 强> 是一种简单的方法,使提取秘密更加困难。有一些工具可以帮到你,对Android来说更是如此,但是你仍然必须拥有生成哈希的代码,并且一个技术娴熟的人总是可以直接调用执行哈希的函数。
另一种减轻过度使用不需要登录的API的方法是 的 风门 强> 流量并可能识别和阻止可疑的IP地址。您想要的努力程度在很大程度上取决于您的数据的价值。
除此之外,您可以轻松地开始进入我的日常工作领域。无论如何,这是保护API的另一个方面,我认为这很重要并且想要标记。