REST API安全性:HMAC /密钥哈希与JWT


16

我刚刚读了这篇已有几年历史的文章,但是描述了一种保护REST API的聪明方法。实质上:

  • 每个客户都有唯一的公钥/私钥对
  • 只有客户端和服务器才知道私钥。它永远不会通过电线发送
  • 对于每个请求,客户端都会获取多个输入(整个请求本身,当前时间戳和私钥),并通过HMAC函数运行它们以生成请求的哈希
  • 然后,客户端将常规请求(包含公钥)和哈希发送到服务器
  • 服务器会查询客户端的私钥(基于提供的公钥),并进行一些时间戳检查(我当然不理解),以验证请求是否不是受害对象。 重播攻击
  • 如果一切正常,则服务器使用私钥和相同的HMAC函数来生成其自己的请求哈希
  • 然后,服务器比较两个哈希(客户端发送的哈希值以及它生成的哈希值);如果它们匹配,则对请求进行身份验证并允许其继续

然后我偶然发现了JWT,听起来很相似。但是第一篇文章根本没有提到JWT,因此我想知道JWT是否与上述auth解决方案不同,如果有所不同,怎么做。


1
大声笑...我只是想问同样的问题,遇到了你的问题。我发现的关于无状态身份验证的第一件事来自AWS:docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/…,并实现了诸如massimilianosciacco.com/…之类的东西。然后我发现了JWS / JWT,它在某种程度上是相似的。但是据我了解,JWT是一种标准,而上述其他解决方案是一些自定义实现(未标准化)。如果我错了,有人纠正我。
nyxz 2015年

2
很高兴知道,我不是唯一担心这些细节的人!JWT当然感觉很相似,而且好处是它是标准化的。我只是想知道这种自定义HMAC解决方案的公平性(在安全方面)。
smeeb

Answers:


7

让我们从一个非常基本的答案开始。

JWT(在OAuth和OpenID的上下文中使用)不需要客户端和API之间的共享机密。有3个组件,每对2个共享一个秘密:客户端<->标识服务器,标识服务器<-> API。

这将最复杂的事情从API转移到了标识服务器,API只需要检查令牌是由标识服务器发出的,并且没有经过调整。为了验证API使用标识服务器和API之间的已知单个共享机密来检查JWT签名是否有效。而已!

身份验证服务器验证用户身份的方式可能相差很大(在许多情况下,这是TLS连接上的旧用户名+密码对),但对您的API无效。

使用JWT时,消息的私密性和安全性以及令牌本身是由TLS处理的,JWT不了解此类问题。

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.