【发布时间】:2017-02-13 11:43:20
【问题描述】:
我想知道一种技术,服务器可以使用该技术识别请求中的数据是否未被攻击者修改。我们在服务器端有 REST API,将从移动应用程序客户端或浏览器调用。我正在考虑使用 JWT(JSON Web Tokens)。但不确定它将如何实现这一目标。人们大多使用 JWT 进行会话管理。我不需要会话管理。我只想检测请求数据修改。在这里需要一些帮助...
【问题讨论】:
我想知道一种技术,服务器可以使用该技术识别请求中的数据是否未被攻击者修改。我们在服务器端有 REST API,将从移动应用程序客户端或浏览器调用。我正在考虑使用 JWT(JSON Web Tokens)。但不确定它将如何实现这一目标。人们大多使用 JWT 进行会话管理。我不需要会话管理。我只想检测请求数据修改。在这里需要一些帮助...
【问题讨论】:
这取决于您想要防御哪种类型的攻击者,但 TL;DR 是您不必做任何事情,因为任何此类保护要么是不必要的(有一些特殊情况例外,如下所述),要么是无用的。
这没有任何意义。您将用于这种保护的任何秘密(本质上用于签署请求)都必须发送给客户端,以便它可以使用它来签署任何它想要的东西。但是如果它被发送到客户端,用户已经拥有它并且可以使用它来签署任何修改过的请求。您必须以在服务器端强制执行安全性且有效用户不能伪造他们不应该发出的请求的方式来构建应用程序。
假设您想保护请求免受用户和服务器之间的某人的攻击。如果您通过安全通道 (https) 访问服务器,它已经为您执行此操作,您无需执行任何其他操作。
但是,我可以想到特殊情况。首先,您可能会担心终止 SSL 的中间代理,例如使用自己的证书为 https 网站提供服务的公司代理,在公司客户端上设置为受信任的根。这是相当普遍的做法,但通常您作为应用程序开发人员不想处理这个问题。另一件事是当您不想使用 SSL 时,但我会说这是一个特殊情况,当您担心请求完整性而不是机密性时。
无论如何,如果您确实需要以除(或代替)https 之外的其他方式保持完整性,您可以为您的客户提供一个秘密并使用该秘密签署请求,例如使用 HMAC或其他消息认证协议。您将从请求标头和整个请求正文中获取相关字段,使用密钥创建它们的 HMAC 并将其附加到请求中。对客户端具有相同秘密的服务器可以创建相同的散列并验证客户端是否具有秘密以及发送的请求是否与用户签名的请求相同。请注意,为了防止重放攻击,您还必须在签名中包含时间戳和/或随机数标头。
接下来的问题是如何将这个秘密安全地提供给客户,并且根据您的具体情况,这可能是一个棘手的问题。
我刚刚意识到您将 csrf 作为问题的标签。请注意,csrf 与修改后的请求无关,通常您必须实施针对 csrf 的保护。
【讨论】:
JSON Web 签名是一种加密机制,旨在使用令牌内容独有的数字签名来保护数据,以便我们能够确定令牌的数据是否已被篡改。
来源:php-authorization-jwt-json-web-tokens
您可以使用 JWT 验证客户端请求,但客户端需要在任何可验证请求之前请求令牌(至少一次)。
令牌仅在服务器端创建使用密钥(从未发送到客户端)用于编码/签署令牌,客户端可以解码并访问令牌但不修改它,只需将其原样发回。
【讨论】: