2013-03-07 94 views
4

我知道这个问题以前曾以各种形式提出过。但是,我不在寻找“使用https”的答案。我已经在使用HTTPS,而且我并不担心有效负载传输的敏感性。但是,我正在使用的iPhone应用程序正在与我创建的REST API(我有应用程序和服务器的控制权 - 因此,欢迎任何建议)交谈。在iPhone应用程序中使用REST API时的安全性

我用于身份验证的OAuth2用户协议,这意味着,我的“API密钥”是一个客户端ID和客户端秘密的组合需要被发送到获取access_token。之后,使用access_token和包含请求主体的HMAC的标头(使用客户机密钥作为密钥)将所有请求发送到服务器。这个添加的唯一原因是,有人不能通过一个access_token进行API请求。

我正在与之交谈的API将在我发布应用程序时公布。所以我不一定担心其他人能够对其进行API调用。

我关心的是:

  • 人们能够使用我的应用程序的客户端凭证(这意味着我无法检测在服务器端,它不是来自我的应用程序调用API )
  • 人们能够滥用额外的范围,我的客户端ID将让他们有和传统的API用户将不必

我的猜测是,有没有真正解决这个问题的解决方案(除使用UIWebView并制作一个glor ified webapp),但我想我会问在这里无论如何。

如果需要应用程序使用,你们都可以考虑保护客户端ID /客户端密码的方法吗?

+0

你是说oauth对你的应用程序不够安全吗? oauth客户端必须签署所有参数,因此只有具有访问令牌和秘密的客户端才能包含一些参数_and_正确签名。 – danh 2013-03-07 16:07:35

+0

@danh实际上,OAuth2不会签署参数(这是OAuth1的一部分,它违反了该规范)。但是,不,我只是用相对微小的努力来说,有人可以对我的应用程序进行逆向工程,并获得我的客户ID和秘密,并将API作为我的应用程序发出请求。 – 2013-03-07 16:12:08

+0

如果您可以(某些人)授予任何购买iPhone应用程序唯一标识符的人,可以将其链接到单个用户的凭据。有了这些,你就可以将已经获得iPhone应用程序的客户与另一个来源的客户区分开来。 – AardvarkSoup 2013-03-07 16:48:02

回答

7

我知道这不是你所希望的答案,但不幸的是,我不认为你能够绝对保证地完成你的目标。在一天结束的时候,你不能相信你不能控制的客户,一旦离开你的手,你就无法控制它。

为了实现您的两个目标,您需要验证访问该API的客户端是否由您编写。做到这一点的方法是使用公钥/私钥对。您需要将私钥嵌入到可用于签署某些内容的客户端中。这样服务器就知道请求来自你的客户而不是别人的请求。这也可以让你限制只有你的客户的某些电话。

但是,这不是防弹的,因为精明的用户可以逆向工程并从您的应用程序中提取私钥并使用它来欺骗源。虽然不是防弹的,但它是防弹的,因为这样做需要很多工作,并且技术性很强,尤其是在使用缓冲涂抹,大量红鲱鱼等抗RE技术时。

如果我对于你,我会问自己,如果有人确信黑客攻击会造成什么样的损害。如果你是Facebook,它是灾难性的。如果你服务于一个内部组织,它可能不是什么大问题。如果你无法承受单一的滥用,那么你需要重新考虑你的设计,因为这一个不起作用。你根本无法信任你无法控制的代码,并且一旦它在别人的设备上,你就不再控制客户端了。

+0

欣赏评论。通过获取'access_token'(或者我的客户端ID /秘密),并不是真的有人能攻击任何东西。只是他们可以向API发出看起来像他们的请求。谁知道,这可能是为什么Facebook是作为一个Web应用程序分发。 – 2013-03-07 17:20:44

+0

如果你可以容忍一些看起来像是来自你但没有的请求,那么你应该可以使用私钥/公钥模型,否则你可能会被卡住。我认为你是对的,这就是为什么Facebook是作为一个Web应用程序发布的:-) – 2013-03-07 17:24:01

+0

@Freedom_Ben,你能解释一下Facebook如何处理这个和分布式Web应用程序吗?或指引我到任何地方,我可以得到更多信息?谢谢 – nightograph 2015-03-16 18:51:24

相关问题