首页 文章

如果你能解码JWT它们如何安全?

提问于
浏览
170

我爱JWT . 合作真的很有趣 . 我的问题是:如果我得到JWT并且我可以解码有效载荷,那么它是如何安全的?我不能只是从 Headers 中获取令牌,解码并更改有效负载中的用户信息,并使用相同的正确编码密码将其发回?

我知道他们必须是安全的,但我真的很想了解这些技术 . 我错过了什么?谢谢!

5 回答

  • 9

    JWT可以是签名,加密或两者兼而有之 . 如果令牌已签名但未加密,则每个人都可以读取令牌的内容,但是当您不知道私钥时,您无法更改它 . 否则,接收方将注意到签名将不再匹配 .

    回答你的评论:我不确定我是否以正确的方式理解你的评论 . 只是为了确定:你知道并理解数字签名吗?我将简要解释一个变体(HMAC,它是对称的,但还有很多其他变体) .

    让's assume Alice wants to send a JWT to Bob. They both know some shared secret. Mallory doesn'知道这个秘密,但想要干涉并改变JWT . 为了防止这种情况,Alice计算 Hash(payload + secret) 并将其作为签名附加 .

    收到消息时,Bob还可以计算 Hash(payload + secret) 以检查签名是否匹配 . 但是,如果Mallory更改了内容中的某些内容,则无法计算匹配的签名(这将是 Hash(newContent + secret) ) . 她再也没有比赛了,鲍勃再也不会接受JWT了 .

    我们假设,我向另一个人发送消息 {"id":1} 并用 Hash(content + secret) 签名 . (这里只是连接) . 我使用SHA256哈希函数,我得到的签名是: 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c . 现在轮到你了:扮演Mallory的角色并尝试签署消息 {"id":2} . 你可以't because you don't知道我用过的秘密 . 如果我认为收件人知道秘密,他可以计算任何邮件的签名并检查它是否正确 .

  • 75

    您可以转到jwt.io,粘贴您的令牌并阅读内容 . 这对最初的很多人来说都很不利 .

    简短的回答是JWT不关心加密 . 它关心验证 . 也就是说,它总能得到“让这个令牌的内容被操纵”的答案?这意味着用户操纵JWT令牌是徒劳的,因为服务器将知道并忽略令牌 . 在向客户端发出令牌时,服务器会根据有效负载添加签名 . 稍后它会验证有效负载和匹配签名 .

    逻辑问题是不加密内容的动机是什么?

    • 最简单的原因是因为它假设这在很大程度上是一个已解决的问题 . 例如,如果处理类似Web浏览器的客户端,则可以将JWT令牌存储在 secure + httpsOnly (可以通过HTTP读取)的cookie中,并通过加密通道(HTTPS)与服务器通信 . 一旦您知道服务器和客户端之间有安全通道,就可以安全地交换JWT或其他任何您想要的东西 .

    • 这样可以保持简单 . 一个简单的实现使得采用更容易,但它也让每个层都做它最擅长的事情(让HTTPS处理加密) .

    • JWT并不意味着存储敏感数据 . 一旦服务器收到JWT令牌并对其进行验证,就可以在其自己的数据库中查找用户ID,以获取该用户的其他信息(如权限,邮政地址等) . 这使JWT的尺寸变小,避免了无意中的信息泄漏,因为每个人都知道不要在JWT中保留敏感数据 .

    它与 Cookies 本身的工作方式并无太大差别 . Cookie通常包含未加密的有效负载 . 如果您使用HTTPS,那么一切都很好 . 如果您不是,那么建议您自己加密敏感cookie . 不这样做意味着可能发生中间人攻击 - 代理服务器或ISP读取cookie,然后假装是你,然后重放它们 . 出于类似的原因,JWT应始终通过HTTPS等安全层进行交换 .

  • 3

    json Web令牌(JWT)中的内容本身并不安全,但有一个用于验证令牌真实性的内置功能 . JWT是由句点分隔的三个哈希 . 第三是签名 . 在公钥/私钥系统中,发行者使用私钥对令牌签名进行签名,该私钥只能通过其对应的公钥进行验证 .

    理解发行者和验证者之间的区别非常重要 . 令牌的收件人是负责验证它 .

    在Web应用程序中安全地使用JWT有两个关键步骤:1)通过加密通道发送它们,以及2)在收到签名后立即验证签名 . 公钥加密的非对称性使得JWT签名验证成为可能 . 公钥验证JWT是否由其匹配的私钥签名 . 没有其他密钥组合可以执行此验证,从而防止模拟尝试 . 按照这两个步骤,我们可以保证数学上确定JWT的真实性 .

    更多阅读:How does a public key verify a signature?

  • 232

    只有JWT的privateKey,它在您的服务器上将解密加密的JWT . 知道privateKey的人将能够解密加密的JWT .

    将privateKey隐藏在服务器的安全位置,永远不要告诉任何人privateKey .

  • -10

    JWT中的数据经过签名和加密,并不意味着它是安全的 . JWT不为敏感数据提供保证 .

    使用私钥(即发送方和接收方都知道的私钥)对数据进行加密,入侵者可以制作密钥并且可以改变内容 .

    据我所知,JWT不提供安全性 .

    谢谢

相关问题