【问题标题】:Is JWT safe if someone knows the secret? If not, how can you make JWT secure?如果有人知道这个秘密,JWT 是否安全?如果没有,您如何使 JWT 安全?
【发布时间】:2018-06-22 20:33:43
【问题描述】:

我最近阅读了很多关于如何使用 JWT 进行身份验证以通过不保存任何与会话相关的数据来提高性能的文章。根据我的理解,它使用秘密对数据(通常是 user_id)进行签名以生成 JWT 令牌。然后每个客户端请求都会发送令牌。服务器只检查签名是否可以验证并信任存储在 JWT 有效负载中的内容。

我担心的是,如果有人知道你的秘密,他可以很容易地自己创建一个 JWT 令牌并伪装成系统中的任何用户。一个简单的例子是任何可以看到源代码的人都可以轻松做到这一点。 (例如:内部成员)

你如何防止它发生?我能想到的一件事是在每次服务器重启时使用随机生成的秘密。 (如果您长时间运行服务器而不更改密钥,这可能仍然不安全)

【问题讨论】:

    标签: security jwt token


    【解决方案1】:

    出于这个原因,许多人似乎对 JWT 的安全性有疑问,并且无法在不失去使用 JWT 的好处的情况下将人列入白名单/黑名单。关于在每次服务器重新启动时生成新密码,请记住,每次更改密码时,您基本上都会“注销”当前登录的每个用户,或者出于您使用它的任何其他目的。我认为通常的做法是确保秘密只是那个秘密。据我所知,保存在一个极少数人可以访问的文件中的随机生成的长字符串是防止当前秘密逃逸的最佳方法。

    要记住的另一件事是,数据绝不会对 JWT 中的任何人隐藏。任何人都可以看到您存储的内容,因此不要在其中存储任何敏感数据。您可能已经从阅读中知道了这一点,但是不小心将敏感数据留在 JWT 的主体中是一个极其容易且致命的错误。

    【讨论】:

    • 这正是我对 JWT 的看法。如果无论如何我都必须访问数据库,那么使用 JWT 有什么好处。但我不确定我是否错过了什么。使用 session id 时,如果访问数据库验证 token 太慢,我们总是可以使用 Redis 来提高性能。
    • @Alex ,Redis 是一种常见的解决方案。许多人喜欢 JWT 只是因为它是无状态的,并且不需要服务器在重启之间保存或保持会话处于活动状态。此外,它的数据库压力较小,具体取决于会话的存储位置。基于令牌的身份验证的最佳用途可能仍然是 Facebook 和 Google 如何使用它们来允许对其他应用程序进行授权。
    • 注意到许多其他身份验证方案已经依赖于共享密钥可能是件好事,但它不那么明显。例如,ASP.NET 在加密已发布的身份验证票证 cookie 时使用机器密钥。其中大部分对开发人员是隐藏的,因此经验不足的开发人员通常不知道它正在为他们处理这些问题。在许多方面与 JWT 非常不同,但我的观点是其他身份验证方案也依赖于共享密钥,并且如果密钥被泄露,就会被泄露。
    猜你喜欢
    • 2021-04-23
    • 2013-08-15
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多