我正在开发一项有一些要求的REST服务:

  1. 必须安全。
  2. 用户不应该伪造请求。
  3. 我目前提出的解决方案是拥有一个类似于此的自定义Authorization标头(这与亚马逊网络服务的工作方式相同):

    Authorization: MYAPI username:signature
    

    我的问题是如何形成签名。当用户登录服务时,他们将获得一个密钥,他们应该能够使用该密钥对请求进行签名。这将阻止其他用户代表他们提交请求,但不会阻止他们伪造请求。

    将使用此服务的应用程序是一个iPhone应用程序,所以我想我们可以在应用程序中嵌入一个公钥,我们可以用它来做额外的签名,但这是否意味着我们必须有两个签名,一个用于用户密钥,一个用于应用密钥?

    任何建议都会非常感激,我非常希望第一次能做到这一点。

有帮助吗?

解决方案

我认为最简单的方法是使用HTTPS客户端身份验证。 Apple的网站上有关于此主题的主题

编辑:为了处理授权,我会在服务器上为每个用户创建一个单独的资源(URI),并且只允许(经过身份验证的)用户操作此资源。

Edit(2014):Apple在过去六年中改变了他们的论坛软件;该主题现在是 https://discussions.apple.com/thread/1643618

其他提示

答案很简单:无法完成。一旦您将任何解决方案发送给最终用户,他或她就可以一直攻击它正在与之通信的服务器。这个问题的最常见版本是在Flash游戏中使用高分列表作弊。您可以通过在客户端中嵌入某种加密并混淆代码来使更难 ...但是所有编译和混淆的代码都可以反过来被反编译和取消模糊。这只是你愿意为可能的攻击者花费多少时间和金钱的问题。

因此,您关注的是 如何阻止用户向系统发送错误数据。这是如何防止用户破坏您的系统。您必须设计接口,以便故障数据造成的所有损坏仅影响发送它的用户。

HTTP摘要式身份验证出了什么问题?

这里有更好的讨论:

保护REST API /网络服务的最佳做法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top