繁体   English   中英

如何使用被盗令牌防止 Rest Web 服务身份验证

[英]How to prevent Rest web-service Authentication with stolen Token

众所周知,Rest 服务是无状态的,身份验证的一般策略是使用基于令牌的身份验证。

在登录服务中,它需要返回令牌的凭据。

此令牌可能在客户端 cookie 中设置,所有后续请求都使用此令牌进行验证并在令牌有效时处理新请求。

现在我的问题是如何验证令牌? 如果有人窃取了令牌并试图通过仅编辑 cookie 来使用窃取的令牌访问休息服务,那么如何识别和限制它?

我们永远无法知道令牌是否由有效用户获取,并且同一用户正在尝试访问后续请求。 但是有什么可能的方法让它更难,比如验证请求是否来自同一个来源?

一个普遍的建议是为令牌/cookies 设置老化,但直到该令牌/cookies 的年龄它仍然没有帮助。

任何建议,将不胜感激。

我不相信有任何 100% 万无一失的方法可以防止使用被盗用户令牌进行访问。 你怎么知道令牌首先被盗了? 但从我的脑海中,您可能需要考虑以下几点:

  1. 使用相同的令牌但不同的用户代理访问 REST 服务是可疑的。 这可以通过 User-Agent 标头的值来识别。 您可能要考虑放弃此类请求。
  2. 如果 IP 地址更改但令牌仍然相同怎么办? 好吧,也许有人正在使用负载平衡器并通过不同的 IP 地址访问网络? 或者他使用与以前相同的令牌/cookie 访问了 VPN? 如果您没有考虑丢弃此类请求,您也可以通过检查源 IP 地址来提高安全性。
  3. 如果是 - 比如说 - JWT 令牌,您将需要一些基础设施来处理黑名单。 按照这个

我目前对在浏览器中授权请求的“最安全”方法的理解是要求结合验证 HttpOnly SameSite cookie 和 HTTP 标头(例如AuthorizationX-CSRF-Token )。

例如,在向浏览器发布 JWT 时,将 JWT 签名发送到HttpOnly SameSite cookie 中,然后将正文(不带签名)发送到客户端存储在localStorage并在Authorization标头中提交。 在授权请求时,将两者结合回完整的 JWT 并在此之后正常验证它。

或者,您可以生成两个带有字段的 JWT 来区分它们(例如,客户端有"browser" ,cookie 有"cookie" ),并要求两者都有效并且都标识同一用户。 一个在Authorization标头中发送并存储在localStorage ,另一个使用SameSite HttpOnly cookie。

另一种流行的方法是将 CSRF 令牌存储在 JWT 的字段中,并将 JWT 放入 cookie 并要求客户端在标头中发送匹配的令牌(例如X-CSRF-Token )。

所有的解决方案都有效地防止了 XSS 和 CSRF 攻击:XSS 无法检索 HttpOnly cookie,并且 CSRF 不包含 HTTP 标头,因此可以阻止这两种攻击。

请注意,您可能只想将此规则应用于来自 Web 浏览器的请求。 对于服务器到服务器的通信,请求不受 CSRF 和 XSS 攻击。

您可以使用 jwt 是一种 Internet 标准,用于创建断言一些声明的基于 JSON 的访问令牌。 例如,服务器可以生成具有“以管理员身份登录”声明的令牌,并将其提供给客户端。 然后客户端可以使用该令牌来证明它以 admin 身份登录。

它是如何工作的?

首先它包含由开发人员生成的私钥:

让我们拥有这个密钥: sfcqw@sav%$#fvcxv*s_s515和这个称为私钥的,我们还有一个公钥,这个公钥生成的公钥取决于用户数据和私钥,如果不知道包含什么是不可能的你不知道私钥。

进一步解释:

公钥:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.plpJkAcgrgCIsoRyV2kjGsvWF6OsXU1mD785OSWTH4o

我们有我们的私钥生成的上述密钥: sfcqw@sav%$#fvcxv*s_s515 在此处输入图片说明 为了更清楚地访问这个网站: https ://jwt.io/ 并尝试通过公钥而不像图片那样放置秘密密钥,你会明白一切。

经过各种方法的挣扎,我们找到了如下解释的解决方案:

  1. 我们在登录请求时将令牌(加密)存储在 cookie 中,并且对于每个后续请求,此 cookie 都会得到验证。
  2. 问题是如果有人用另一个有效的令牌替换 cookie 中的令牌,因为 cookie 是由客户端浏览器维护的。

解决方案:-> 虽然令牌值被加密,但它只代表一个值,所以如果用另一个有效的加密值替换整个加密值,它可能会被黑客入侵。

所以为了解决这个问题,我们添加了另一个 cookie,它是多个值的组合。

例如

Cookie 1 -> 加密令牌

Cookie 2 -> 一个加密对象,包含用户名+一些其他用户上下文详细信息+令牌等信息

因此,在 Cookie 1 的情况下,很容易用另一个加密值替换,因为它虽然是加密的,但只代表一个令牌。

但是在 Cookie 2 的情况下,它包含具有多个值的对象,因此只能在同一个 cookie 中修改、加密和设置令牌值。

在身份验证之前,我们正在对整个 cookie 2 进行解密,从中获取令牌部分并根据 cookie 1 验证它的令牌部分。

这就解决了我们的问题!!

感谢大家的时间和指导。

对我来说,除了 JWT 令牌之外,没有办法防止访问被盗

  • 为令牌设置一个短暂的超时时间
  • 通过仅允许特定的“用户代理”在 HTTP 请求级别更加安全。 查看更多
  • 通过为组织定制标头密钥,在 HTTP 请求级别更加安全,例如My-X-Auth = Bearer <token>而不是Authorization= Bearer <token>
  • 通过限制受信任的 url/域,在 HTTP 请求级别更加安全,例如X-Content-Security-Policy 查看更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM