麻烦了解JWTS如何使用RSA(中间人攻击)?

麻烦了解JWTS如何使用RSA(中间人攻击)?,jwt,Jwt,我很难理解JWTs是如何与RSA加密结合使用的。这是我目前对RSA的理解: -客户端日志使用其凭据向服务器发出post请求,如果凭据有效,服务器将使用私钥签署JWT并将其发送给客户端 -客户端使用公钥验证来自服务器的JWT,然后存储此JWT以备将来的请求 现在,客户端是否只是将这个JWT附加到我对受保护路由发出的每个get/post请求的头上,以便验证用户?这不会容易受到中间人攻击,因为他们可以很容易地改变请求的内容,而服务器将无法知道它被修改了。我应该如何散列标头+有效负载以阻止实体像HMAC

我很难理解JWTs是如何与RSA加密结合使用的。这是我目前对RSA的理解:

-客户端日志使用其凭据向服务器发出post请求,如果凭据有效,服务器将使用私钥签署JWT并将其发送给客户端

-客户端使用公钥验证来自服务器的JWT,然后存储此JWT以备将来的请求


现在,客户端是否只是将这个JWT附加到我对受保护路由发出的每个get/post请求的头上,以便验证用户?这不会容易受到中间人攻击,因为他们可以很容易地改变请求的内容,而服务器将无法知道它被修改了。我应该如何散列标头+有效负载以阻止实体像HMAC那样更改数据?

这里您似乎缺少的关键信息/理解是JWT包含一个校验和,它是一个依赖于JWT内容的散列。服务器在将每个JWT发送回客户端(包括校验和)之前,将使用其私钥对其进行签名。接收到传入JWT后,JWT将再次基于内容计算校验和,并与令牌本身包含的校验和进行比较。如果中间人攻击试图插入或更改JWT的内容,则计算的校验和将与JWT中嵌入的值不匹配。接下来,您可能会问,是什么阻止中间人也计算正确的校验和。嗯,如果没有服务器密钥,MITM无法做到这一点。哈希在很大程度上不可能对用于签名的密钥进行反向工程。因此,只要您保护您的服务器密钥不被劫持,JWT模式实际上是非常安全的。

@Craig如果您询问的是包含JWT的消息头,那么您就不是真正询问JWT。为了避免通用的MITM攻击,您可以考虑使用双向SSL。服务器应该是这里的看门人。它使用校验和颁发签名JWT令牌,并验证这些校验和。客户最多可以添加/删除一些声明,并尝试猜测新的校验和,但它几乎肯定会猜错。不……我的答案也不是这样说的。每一个来自服务器的新JWT总是使用其内容特有的新校验和进行签名。如果内容改变,校验和也必须改变。@Craig我想我明白你的意思了。JWT本身由签名保护,但它不保护请求内容。但这并不取决于签名的类型,RSA与HMAC(这似乎是最初的问题)HMAC使用相同的密钥对验证进行签名(对称算法),因此您必须在服务器上绝对安全地保守秘密,任何客户端都不应该知道。用于对授权JWT进行签名的私钥对签名服务器也是绝对私有的。是的,https意味着请求在客户端和服务器之间被加密。他们可以很容易地更改请求的内容,服务器将无法知道它被修改了。。。阻止实体更改数据,如使用HMAC?-我不明白那一点。为什么您认为服务器在使用RSA签名时不会注意到,而在使用HMAC时会注意到?因为我只是在使用RSA时在请求头中附加标识用户的JWT,所以请求的实际内容没有校验和。使用HMAC,我可以创建另一个JWT,使用密钥存储请求内容,如果有人修改请求,JWT签名将不匹配。