REST API授权和身份验证(Web +移动)


70

我已经阅读了有关oAuth,Amazon REST API,HTTP Basic / Digest等的信息,但无法将其全部整合为“单个”。这可能是最接近的情况-为移动应用程序创建API-身份验证和授权

我想建立以API为中心的网站-服务。因此(一开始)我将在中心拥有一个API,而网站(PHP + MySQL)将通过cURLAndroidiPhone通过它们的网络接口进行连接。因此,有3个主要客户-3个API密钥。其他开发人员也可以通过API接口进行开发,他们将获得自己的API密钥。根据用户级别的状态,API操作将被接受/拒绝,如果我是管理员,则可以删除任何内容,等等,其他所有操作都只能操作其本地(帐户)数据。

首先,授权-我应该使用oAuth + xAuth还是我自己的某种实现(请参阅http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html?r=9197)?据我了解,Amazon服务用户是== API用户(具有API密钥)。在我的服务中,我需要将标准用户/帐户(在网站上注册的用户)和开发者帐户(应具有其API密钥)分开。

因此,我首先需要授权API密钥,然后验证用户本身。如果我使用亚马逊的方案检查开发人员的API密钥(授权他们的应用程序),那么我应该使用哪个sheme进行用户身份验证?

我读到有关通过api.example.org/auth(通过HTTPS,HTTP Basic)发布我的用户名和密码,然后在随后的每个请求中转发令牌的方式获得令牌的信息。如果同时在Android网站上登录,如何管理令牌?如果我仅在第一个请求(传输用户名和密码时)仅使用SSL而在其他请求上仅使用HTTP时,中间人攻击怎么办?在此示例中,密码保护REST服务不是问题吗?

Answers:


125

一直以来,保护密钥的最佳方法是不传输密钥。

也就是说,我们通常使用一种方案,其中每个“ API密钥”都有两个部分:非秘密ID(例如1234)和秘密密钥(例如byte [64])。

  • 如果提供了API密钥,请将其(加盐和散列)存储在服务的数据库中。
  • 如果提供用户帐户(受密码保护),则将密码(加盐和散列)存储在服务的数据库中

现在,当消费者首次访问您的API进行连接时,请他

  • 发送一个“用户名”参数(“ john.doe”不是秘密)
  • 发送“ APIkeyID”参数(“ 1234”,不是秘密)

还给他

  • 数据库中的盐(如果其中一个参数错误,只需返回一些可重复的盐-例如sha1(username +“ notverysecret”)。
  • 服务器的时间戳

消费者应在会话期间存储盐,以使事情变得快速顺畅,并且他应计算并保持客户端与服务器之间的时间偏移。

消费者现在应该计算API密钥和密码的哈希值。这样,使用者就可以使用与存储在数据库中的密码和API密钥完全相同的哈希值,而不会遇到任何秘密问题。

现在,当消费者subseqently访问您的API,做实事,让他

  • 发送一个“用户名”参数(“ john.doe”不是秘密)
  • 发送“ APIkeyID”参数(“ 1234”,不是秘密)
  • 发送“ RequestSalt”参数(字节[64],随机,不是秘密)
  • 发送“ RequestTimestamp”参数(根据客户端时间和已知偏移量计算)
  • 发送“ RequestToken”参数(哈希(密码哈希+ request_salt + request_timestamp + apikeyhash))

服务器不应接受过去超过2秒的时间戳记,以使其免受重放攻击。

服务器现在可以计算与客户端相同的哈希(passwordhash + request_salt + request_timestamp + apikeyhash),并确保

  • 客户端知道API密钥,
  • 客户知道正确的密码

1
好答案,谢谢。但是我可以通过在UTC时间上同时设置客户端和服务器来避免“时间偏移”吗?还是提供/ date GET请求作为Amazon以计算偏移量?
svenkapudija'2

1
你当然可以。时间戳对于重放安全性很重要,因此任何适合您的方法都可以。如果两端都具有NTP,则可以省略偏移量计算步骤。
Eugen Rieck '02

1
您使用哪种哈希方法,或者只是确保盐足够长?有人说尽可能安全-SHA256 / 512,甚至使用HMAC?
svenkapudija

1
我们将sha256与ca一起使用。100字节盐。这需要天文资源来还原。
Eugen Rieck '02

8
TLS / SSL有很多要说的地方-其中一个重要部分是,它提供了完整对话的机密性。对于SSL还有很多要说的内容:安装程序可以是PITA,尤其是对于异类设备/ OS。如果你没有需要保密,但authentiucation,上述方案是尽善尽美。
欧根·里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.