【发布时间】:2014-03-10 23:29:04
【问题描述】:
我正在设计我的第一个 RESTful API,并试图弄清楚我将如何对 API 调用进行身份验证。我过去曾与Gengo API (dev docs) 合作过,并且很幸运,因此不可否认,我的很多身份验证设计都基于该链接中描述的他们的算法。
总结他们的过程,创建一个有效/经过身份验证的 API 调用:
- 向他们注册一个帐户并生成一个公钥/私钥集。然后对于每个 API 调用:
- 获取正在进行调用的 UNIX 纪元时间戳。
- 根据您的私钥计算时间戳的 SHA-1 哈希值。
- 确保您的公钥、私钥和计算的哈希值(上图)在每个 API 调用中都以 3 个单独的 HTTP 参数的形式出现。
起初这让我有点困惑,但我能够使用他们的 API 快速进行身份验证。但我从来没有完全理解为什么我必须生成这个 SHA-1 哈希,而且我不知道他们在服务器端做了什么来实际验证我的 API 调用。
现在我正在编写自己的经过身份验证的 API,我需要了解这些内容。所以我问:
- 时间戳及其派生的 SHA-1 哈希有什么用途?为什么只要求用户在每次 API 调用时向我发送他们的公钥/私钥会不太安全?
- 这是
pubkey + privkey + hashed_timestampGengo 使用标准化做法进行 API 身份验证的方法吗?如果是这样,它有名称/算法吗?还有其他同样安全的竞争对手吗? - 我对整个 HMAC/SHA-1 的内容感到困惑(具体示例请参见上面的链接)。我一直认为 SHA-1 是一种单向函数,可以将字符串转换为类似于 MD5 提供的编码字符串。但在那个例子中(见链接),它看起来像是将 SHA-1 和字符串传递给一些 HMAC 算法。这个 HMAC 的用途是什么?为什么它需要 3 个参数(SHA-1、时间戳和私钥)?
- 最后,服务器端的 3 个参数(pub key、priv key、hashed timestamp)如何进行认证呢?如果我正在设计一个仅使用 pub/priv 键的系统,那么我会将它们视为用户名/密码组合,并检查数据库以查看该组合是否存在。但是散列的时间戳真的让我失望了。
【问题讨论】:
标签: api rest authentication public-key-encryption hmac