使用JWT检测服务器端请求修改的技术

时间:2016-10-05 06:39:32

标签: request csrf jwt json-web-token

我想知道一种技术,服务器可以通过该技术识别攻击者是否未修改请求中的数据。我们在服务器端使用REST API,它将从移动应用客户端或浏览器调用。我在考虑使用JWT(JSON Web令牌)。但不确定它将如何实现这一目标。人们大多使用JWT进行会话管理。我不需要会话管理。我只想检测请求数据修改。需要一些帮助...

2 个答案:

答案 0 :(得分:1)

这取决于你想要防范的攻击者类型,但TL; DR是你不需要做任何事情,因为任何这样的保护是不必要的(如下所述的一些特殊情况例外)或无用。

防止有效用户修改自己的请求

这没有意义。您将用于此类保护的任何秘密(基本上用于签名请求)都必须发送给客户端,以便它可以使用它来签署任何想要的内容。但是如果它被发送到客户端,则用户已经拥有它并且可以使用它来签署任何修改的请求。您必须以在服务器端强制执行安全性的方式构建应用程序,并且有效用户不能伪造他们不应该发出的请求。

防范中间人攻击

假设您想要保护用户和服务器之间的某些人的请求。如果您通过安全通道(https)访问服务器,它已经为您执行此操作,除此之外您不必实现任何其他操作。

但是,我可以想到特殊情况。首先,您可能会担心终止SSL的中间代理,例如,为具有自己的证书的https网站提供服务的公司代理,在公司客户端上设置为受信任的根。这是相当普遍的做法,但通常您作为应用程序开发人员不想处理此问题。另一件事是当你不想使用SSL时,但是当你担心请求的完整性时,我会说这是一个特例,而不是保密性。

无论如何,如果您实际上需要以另一种方式维护完整性,除了(或代替)https之外,您可以给您的客户一个秘密并签署具有该秘密的请求,例如使用HMAC或其他消息认证协议。您将从请求标头以及整个请求主体中获取相关字段,使用该秘密创建它们的HMAC并将其附加到请求。对客户端具有相同秘密的服务器可以创建相同的散列并验证客户端是否具有该秘密,以及发送的请求是否与用户签名的相同。请注意,为了防止重放攻击,您还必须在签名中包含时间戳和/或随机数标题。

接下来的问题是如何安全地将这个秘密传达给客户,并且根据您的情况,这可能是一个难以解决的问题。

修改

我刚刚意识到你有csrf作为问题的标签。请注意,csrf与已修改的请求无关,并且您必须实施针对csrf的保护。

答案 1 :(得分:0)

  

JSON Web签名是一种加密机制,旨在通过对令牌内容唯一的数字签名来保护数据,以便我们能够确定令牌的数据是否已被篡改。 / p>

来源:php-authorization-jwt-json-web-tokens

您可以使用JWT验证客户端请求,但客户端需要在任何可验证的请求之前请求令牌(至少一次)。

仅在服务器端创建令牌,使用密钥(从未发送到客户端)用于对令牌进行编码/签名,客户端可以解码并访问令牌,但不会修改它,只需将其发送回原样