11

过去几天我一直在玩弄一个简单的应用程序想法,因为我正在尝试自学 REST 身份验证的基础知识。

到目前为止,我已经收集到最好的方法是使用 HMAC 的实现,就像 Amazon 使用的那样。

我最大的担忧是我究竟应该如何验证用户给他们他们的私钥,以便他们可以开始签署 HMAC?我一直在读到,用于签署 HMAC 的私钥不应该通过网络发送但是他们一开始是如何得到它的呢?

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

用户数据库表:

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

假设一个 HTML/JS 客户端,用户将看到一个传统的登录页面,该页面通过以下方式 POST 到 API:

https://example.com/myapp/api/v1/authenticate.json
POST: username / password

那将返回

404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }

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

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

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

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

4

1 回答 1

13

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

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

对于 Amazon S3,他们会在您注册时为您提供“AWS 秘密访问密钥”。稍后,您的应用程序代码需要知道密钥才能计算签名(或者它需要知道签名的请求/url)所以最终“秘密访问密钥”在注册期间至少通过线路传输一次。

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

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

如果您的目标只是在用户在登录页面上进行身份验证后验证对您的站点发出的 AJAX 请求 - 您可以简单地使用服务器签名的 cookie。

于 2013-07-18T04:18:41.220 回答