当前位置: 首页 > 知识库问答 >
问题:

如果你能解码JWT,那么它们是如何安全的呢?

阴禄
2023-03-14

如果我得到一个JWT并且我可以解码有效负载,那怎么会安全呢?难道我不能直接从报头中抓取令牌,解码并更改有效负载中的用户信息,然后用同样正确的编码秘密将其发回吗?

我知道他们必须是安全的,但我只是真的想了解技术。我错过了什么?

共有2个答案

颜修真
2023-03-14

您可以转到jwt.io,粘贴令牌并阅读内容。这对很多人来说是一个不和谐的开始。

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

合乎逻辑的问题是什么动机不关心自己加密的内容?

>

  • 最简单的原因是因为它假设这是一个大部分已解决的问题。如果处理客户端(例如web浏览器),您可以将JWT令牌存储在cookie中,该cookie是secure(不通过HTTP传输,仅通过HTTPS传输)和httponly(Javascript无法读取),并通过加密通道(HTTPS)与服务器对话。一旦您知道在服务器和客户机之间有一个安全通道,您就可以安全地交换JWT或任何您想要的东西。

    这让事情变得简单。一个简单的实现使采用更加容易,但它也允许每一层做它最擅长的事情(让HTTPS处理加密)。

    JWT不是用来存储敏感数据的。一旦服务器接收到JWT令牌并对其进行验证,它就可以自由地在自己的数据库中查找用户ID以获得该用户的其他信息(如权限、邮政地址等)。这使JWT保持了较小的尺寸,并避免了无意中的信息泄漏,因为大家都知道不要在JWT中保留敏感数据。

    这与Cookie本身的工作原理没有太大区别。Cookie通常包含未加密的有效负载。如果您使用的是HTTPS,那么一切都是好的。如果不是,那么最好对敏感cookie本身进行加密。如果不这样做,就意味着中间人攻击是可能的--代理服务器或ISP读取cookie,然后假扮成您重放它们。出于类似的原因,JWT应该始终在像HTTPS这样的安全层上进行交换。

  • 祁鸿晖
    2023-03-14

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

    回答你的评论:我不确定我是否正确地理解了你的评论。只是为了确定一下:您了解和理解数字签名吗?我只简单解释一个变体(HMAC,它是对称的,但还有很多其他的)。

    让我们假设Alice想要向Bob发送一个JWT。他们都知道一些共同的秘密。马洛里不知道这个秘密,但想要干涉和改变JWT。为了防止这种情况,Alice计算散列(有效载荷+秘密)并将其附加为签名。

    当接收到消息时,Bob还可以计算散列(有效载荷+秘密)来检查签名是否匹配。但是,如果Mallory更改了内容中的某些内容,她将无法计算匹配的签名(即hash(newContent+secret))。她不知道这个秘密,也没有办法知道。这意味着如果她更改了某些内容,签名将不再匹配,并且Bob将不再接受JWT。

    让我们假设,我向另一个人发送消息{“id”:1}并用哈希(内容+秘密)签名。(+在这里只是串联)。我使用SHA256哈希函数,得到的签名是:330E7B0775561C6E95797D4DD306A150046E239986F0A1373230FDA0235BDA8C。现在轮到您了:扮演Mallory的角色,尝试对消息{“id”:2}进行签名。你不能因为你不知道我用了哪个秘密。如果我假设收件人知道秘密,他可以计算任何消息的签名并检查它是否正确。

     类似资料:
    • 问题内容: 值类型的实例不共享:每个线程都有自己的副本。*这意味着每个线程都可以读写其实例,而不必担心其他线程在做什么。 然后我被带到了这个答案及其评论 并被告知: 从多个线程访问的数组本身本身不是线程安全的,因此所有交互必须同步。 &告诉我 每个线程都有自己的副本 如果一个线程正在更新数组(大概是这样,您就可以从另一个队列中看到该编辑内容),那根本就不适用 根本不适用 <-为什么不呢? 我最初以

    • 在安全和身份验证策略方面,我完全是个笨蛋。所以我阅读了这篇关于“基于令牌的身份验证”的文章:https://scotch.io/tutorials/the-ins-and-out-of-token-based-authentication > 我不明白为什么中间人(或黑客)不能看到客户端发送的令牌,并使用令牌冒充该客户端/个人来检索资源?在这种意义上,什么使基于JSON Web令牌/OAuth2的

    • iOS 6和Xcode 4.5有一项新功能,称为“Unwind Segue”: 展开分段可以允许转换到故事板中的现有场景实例 除了Xcode 4.5发行说明中的这一简短条目外,UIViewController现在似乎有两个新方法: 展开段如何工作以及它们可以用于什么?

    • 本文向大家介绍如果你是网约车的产品经理, 你会如何设计安全保障的功能?相关面试题,主要包含被问及如果你是网约车的产品经理, 你会如何设计安全保障的功能?时的应答技巧和注意事项,需要的朋友参考一下 利益相关,这个题就不展开聊了,以下分为几个部分。 安全基础设置: 包括但不限于以下方案。1、设置紧急联系人与在线报警,出现紧急情况时用户可以一键报警,上传gps和实时语音。2、车内安全设置完善和普及,全程

    • 问题内容: 我们将注释定义为接口,如下所示 而且我们知道所有注释默认都会扩展接口。 当我检查接口的Java库时,我发现它覆盖了Object类等许多方法。 如果Annotation是一个接口,那么它如何扩展Object类并覆盖其方法?接口只能扩展其他接口,不能扩展类。 问题答案: 所以我的问题是,如果Annotation是一个接口,那么它将如何扩展Object类并覆盖其方法 不完全是。Java语言规

    • 问题内容: 我多次听到Java妨碍JIT(即时)编译的情况,其可跨平台移植的字节码被JVM“解释”。但是,我真的不知道字节码是什么,以及JVM在Java语言体系结构中的实际含义。我想进一步了解他们。 问题答案: JVM(Java虚拟机)具有与真实计算机一样的指令集。给该指令集的名称是Java字节码。在Java虚拟机规范中对其进行了描述。其他语言在执行之前会被翻译成字节码,例如ruby和python