15

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

  1. 它必须是安全的。
  2. 用户不应该能够伪造请求。

我目前提出的解决方案是有一个看起来像这样的自定义授权标头(这与亚马逊网络服务的工作方式相同):

Authorization: MYAPI username:signature

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

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

任何建议将不胜感激,我很想第一次就做到这一点。

4

4 回答 4

8

答案很简单:做不到。一旦您向最终用户提供任何解决方案,他或她就可以随时攻击与之通信的服务器。此问题最常见的版本是在 Flash 游戏中使用高分列表作弊。您可以通过在客户端中嵌入某种加密并混淆代码来使其更难......但是所有编译和混淆的代码都可以被反编译和不混淆。这只是你愿意花费多少时间和金钱的问题,同样的还有潜在的攻击者。

So your concern is not how to try to prevent the user from sending faulty data to your system. It is how to prevent the user from damaging your system. You have to design your interfaces so that all damage done by faulty data only affects the user sending it.

于 2009-05-01T09:04:32.317 回答
2

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

于 2008-10-27T15:29:21.603 回答
1

我认为最简单的方法是使用 HTTPS 客户端身份验证。苹果的网站有一个关于这个主题的主题

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

编辑(2014):苹果在过去六年改变了他们的论坛软件;该线程现在位于https://discussions.apple.com/thread/1643618

于 2008-10-27T15:27:34.447 回答
1

这里有一个更好的讨论:

保护 REST API/Web 服务的最佳实践

于 2008-10-31T20:24:42.827 回答