验证RESTful API

时间:2014-05-15 18:18:43

标签: php android rest restful-authentication

我相信你已经多次在stackoverflow上看过类似的问题,而且我已经分享了很多次浏览,但没有找到我想要的具体答案。

所以,我的问题是:我正在开发一个面向私有的API,我的移动应用程序将使用它,我在选择特定的身份验证选项及其实现时遇到了困难。

我已经阅读了许多文章,告诉我使用HMAC-SHA1摘要身份验证的优点和一些赞美基于oAuth的REST API认证,坦率地说,这让我更加困惑,因为这是我第一次开发RESTful API 。

我需要问的是如何选择使用哪种身份验证方法?为什么?我知道使用HMAC或摘要式身份验证会在服务器上产生额外的开销,因为请求将分两个阶段进行处理:

  1. 客户端向服务器请求资源

  2. 服务器回复401状态代码和一堆标题参数,如nonce,realm和诸如此类,

  3. 客户端重新发送相同的请求,但现在创建请求正文的哈希并对先前发送的参数进行进一步处理。

  4. 现在有更多问题:

    1. 为什么这么复杂?它不会降低服务器的效率一半并增加服务器上的带宽开销吗?

    2. 如何在服务器和应用程序之间共享密钥,而无需将密钥或哈希存储在应用程序的某个位置(可能是文件或数据库)。这样做不会让任何拥有root电话的用户访问资源文件甚至是SQLlite数据库,表及其数据吗?

    3. 正如你可能已经聚集的那样,我现在非常困惑,如果你能在这方面让我朝着正确的方向努力,我将非常感激。 谢谢。

      编辑:我将使用SSL / HTTPS在服务器和客户端之间进行通信。

1 个答案:

答案 0 :(得分:0)

安全网络服务必须提供以下4项服务:

  • 身份验证:安全协议应允许服务器进行验证 客户端已在特定时间段内进行了身份验证。 此外,任何客户都不应该伪造有效的 请求/令牌。

  • 机密性:安全请求的内容仅供参考 供服务器阅读。

  • 完整性:安全协议应该允许服务器检测是否 请求/令牌已被修改。

  • 反重播:在攻击者重放被盗令牌的情况下,a 安全协议应该能够检测到令牌/请求 无效。

要授予这四项服务,必须使用SSL / TLS。这将授予客户端与其通信的服务器是好的服务器并且将提供机密性。

要对客户端进行身份验证,服务器需要包含有效客户端或用户的列表。说实话,您使用的身份验证方式取决于您的要求:

  • HTTP Basic:在TLS下是一个有效的选项,它非常快。更好的 需要性能的系统。

  • HTTP Digest:说实话,它或多或少像基本一样安全 HTTP因为它易受MiM攻击,因此仅在TLS时有效。 它比较慢。

  • 您自己的令牌(如亚马逊)或其他令牌实施 (OAuth ...):为什么不,它更复杂,你需要安装一个 客户端上的密钥(难以部署)但可能会 最安全的选择...

在我看来,无论如何你都必须使用TLS,而客户端中密钥的管理可能会很痛苦并且通常很容易受到攻击。