Api 使用SHA-1散列的PKE REST身份验证

Api 使用SHA-1散列的PKE REST身份验证,api,rest,authentication,public-key-encryption,hmac,Api,Rest,Authentication,Public Key Encryption,Hmac,我正在设计我的第一个RESTful API,并试图弄清楚如何对API调用进行身份验证。我过去曾与之合作过,而且运气很好,所以我的很多auth设计都是基于链接中描述的算法 总结他们的过程,创建有效/经过身份验证的API调用: 向他们注册帐户并生成公钥/私钥集。然后,对于每个API调用: 获取进行调用的时间戳 根据私钥计算时间戳的SHA-1散列 确保您的公钥、私钥和计算出的散列(如上)在每个API调用中作为3个单独的HTTP参数出现 起初,这让我有点困惑,但我能够用他们的API很快地进行身份验证。但

我正在设计我的第一个RESTful API,并试图弄清楚如何对API调用进行身份验证。我过去曾与之合作过,而且运气很好,所以我的很多auth设计都是基于链接中描述的算法

总结他们的过程,创建有效/经过身份验证的API调用:

  • 向他们注册帐户并生成公钥/私钥集。然后,对于每个API调用:
  • 获取进行调用的时间戳
  • 根据私钥计算时间戳的SHA-1散列
  • 确保您的公钥、私钥和计算出的散列(如上)在每个API调用中作为3个单独的HTTP参数出现
  • 起初,这让我有点困惑,但我能够用他们的API很快地进行身份验证。但是我从来没有完全理解为什么我必须生成这个SHA-1散列,我也不知道他们在服务器端做什么来实际验证我的API调用

    现在我正在编写自己的经过身份验证的API,我需要了解这些事情。所以我问:

  • 时间戳及其派生的SHA-1散列有什么用途?为什么仅仅要求用户在每次API调用时向我发送他们的公钥/私钥就不那么安全
  • 这是Gengo使用API认证标准实践的
    pubkey+privkey+hashd_timestamp
    方法吗?如果有,是否有名称/算法?还有其他同样安全的竞争对手吗
  • 我对整个HMAC/SHA-1的内容感到困惑(具体示例见上面的链接)。我一直认为SHA-1是一个单向函数,它将字符串转换为一个unqiue编码字符串,类似于MD5提供的字符串。但在该示例中(请参见链接),它看起来像是将SHA-1和字符串传递给某个HMAC算法。这个HMAC的用途是什么?为什么它需要3个参数(SHA-1、时间戳和私钥)
  • 最后,如何处理服务器端的3个参数(pub-key、priv-key、hash-timestamp)来执行身份验证?如果我正在设计一个只使用pub/priv密钥的系统,那么我会将它们视为用户名/密码组合,并检查数据库以查看该组合是否存在。但是哈希时间戳真的让我很反感
  • 时间戳及其派生的SHA-1散列有什么用途?为什么仅仅要求用户在每次API调用时向我发送他们的公钥/私钥就不那么安全

    为了消除您事先似乎存在的任何误解,用户应绝不通过网络发送私钥。私钥是保持私密性的。这是您和用户之间共享的秘密。重新阅读Gengo链接,您将看到它仅用作HMAC函数的参数。这取决于用户找到保护它的方法,但是您的API不需要它来验证调用

    时间戳有两个用途。首先,它是一段数据,您将获得明文和HMAC。您将使用用户的私钥重新计算HMAC。如果HMAC检查,这意味着不仅时间戳没有被篡改,而且只有知道私钥的人才能发送它。它为该数据段提供了完整性和真实性

    如果是一个简单的SHA1,攻击者可能会截获消息,更改时间戳,并重新计算哈希。通过使用键控散列,您可以确保发送者是您认为的那个人

    时间戳的第二个用途是防止重播攻击。即使使用键控哈希,攻击者也可能捕获旧请求并再次发送,可能触发不必要的操作。如果您的用户对时间进行散列,您对其进行测试并拒绝不合理的旧请求,则可以防止此类重播攻击

    Gengo使用的是标准化API认证实践中的pubkey+privkey+Hashd_时间戳方法吗?如果有,是否有名称/算法?还有其他同样安全的竞争对手吗

    同样,私钥没有通过管道发送。使用HMAC进行API身份验证非常常见。例如,它被用于。在Gengo方式中使用时,似乎存在公钥/私钥对这一事实可能令人困惑,它实际上仍然是对称加密,私钥用作共享密钥

    然而,我认为最好在HMAC’ed的数据中包含更多的时间戳。否则,攻击者可能会篡改请求的其他部分。还应该包括头、HTTP谓词和请求内容的散列

    另一种方案是使用客户端的私钥对一段数据进行签名(使用私钥加密),因此服务器只需要使用客户端的公钥进行验证,而不需要知道客户端的私钥。仍然需要嵌入时间信息以防止重播。我对这个方案了解不多,首先可能很难用给定的公钥可靠地链接客户端

    这样做的目的是什么 HMAC serve以及为什么它需要3个参数(SHA-1,时间戳 私钥呢

    HMAC是键控哈希。考虑消息验证的最简单形式:<代码>散列(密钥+消息< /代码>)。发现这是不安全的(请参阅),嵌套结构修复了该漏洞

    HMAC是该结构的通用名称:
    hash(k1+散列(k2+消息))
    ,其中
    k1
    k2
    是从实际密钥派生的。因此,当我们执行HMAC时,我们需要传递将要使用的实际哈希算法的名称(这里是SHA-1)、消息(这里是时间戳)和密钥

    最后,我该如何处理3个参数(pub键、priv键、散列键) 要在服务器端执行身份验证吗?