REST身份验证和HMAC /私钥(何时设置?)

jfr*_*how 10 authentication rest web-services restful-authentication

在过去的几天里,我一直在用一个简单的应用程序想法,因为我正在尝试自学REST基础知识.

到目前为止,我已经认识到,实现这一目标的最佳方式是使用亚马逊使用的HMAC.

我最关心的是我究竟如何对用户进行身份验证为他们提供私钥,以便他们可以开始签署HMAC?我一直读取用于签名的HMAC私钥不应该通过线路发送,但后来如何,他们曾经把它摆在首位?

我的想法是这样的,但我不确定这是否有效.

用户数据库表:

users (simplified, this would probably be a private key per client app?)
  id (their public key?)
  username
  password?
  privatekey
Run Code Online (Sandbox Code Playgroud)

假设一个HTML/JS客户端将向用户呈现一个传统的登录页面,该页面向API发送POST,如下所示:

https://example.com/myapp/api/v1/authenticate.json
POST: username / password
Run Code Online (Sandbox Code Playgroud)

那也会回来

404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }
Run Code Online (Sandbox Code Playgroud)

客户端然后将该密钥存储在某个地方(本地存储/ cookie是安全的地方吗?)并使用它来签署看起来像这样的其他请求

GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
Run Code Online (Sandbox Code Playgroud)

然后,服务器将检查公钥,检索关联的私钥并重建HMAC签名,如果它们匹配,则我们有经过身份验证的请求处理它.

我说得对吗?如果我仍然需要像我的例子中那样的密码,我不确定我是否理解私钥的作用,所以有些东西告诉我,我可能错了.

Ser*_*zin 12

我认为您需要提供有关您的应用程序及其使用方式的更多详细信息.您可以通过多种方式进行REST身份验证.其中一些是标准的,一些不是.这只是一些例子:

  1. SSL上的基本身份验证
  2. 摘要式身份验证
  3. 各种令牌认证(OAuth 2,SPNEGO,各种STS)
  4. HMAC
  5. 客户端SSL证书
  6. 签名/加密的cookie.

如果是Amazon S3,他们会在您注册时为您提供"AWS秘密访问密钥".稍后您的应用程序代码需要知道能够计算签名的密钥(或者它需要知道已签名的请求/ URL).因此,最初"秘密访问密钥"最初在注册期间至少一次通过网络传输.

如果您使用公钥加密(如客户端SSL证书) - 您可以完全避免传输私钥

  1. 您在客户端生成公钥/私钥
  2. 将公钥提交给服务器(或由受信任的机构签名的证书)
  3. 使用私钥和服务器的签名请求(或随机数)使用公钥验证签名.

如果您的目标是仅在用户在登录页面上进行身份验证后对您的站点发出的AJAX请求进行身份验证 - 您只需使用服务器签名的Cookie即可.