【问题标题】:How does JWT secure it's values?JWT 如何保护其价值?
【发布时间】:2016-05-11 02:02:52
【问题描述】:

我了解 JWT 是安全的。但只是想知道一些我看不懂的概念。

假设身份验证服务器“A”将签名令牌发送到应用程序服务器。如果我没记错的话,签名是由服务器“A”上的私钥完成的。现在应用服务器可以解密令牌并使用公钥验证信息。我还读到 JWT 是自包含的,它包含数据和签名。

我看到的一些示例在验证时没有使用任何安全密钥。如果我没记错的话,RS256 不需要任何特定的密钥,我假设它会使用公共证书来解密。

我的查询是,如果 JWT 是自包含的,为什么不能在两者之间更改数据。

例如假设服务器“A”发送以下信息

header.user1email.signature

如果黑客将数据替换为

header.user2email.signature

使用他自己的私钥,怎么可能是有效数据?如何确定它来自服务器“A”?

我知道这里缺少一些基础知识,请帮忙?

【问题讨论】:

  • 嗨@CreativeManix - 我的回答解决了你的问题吗?如果是这样,您愿意关闭这个问题吗?

标签: security jwt azure-ad-b2c


【解决方案1】:

在您的情况下,服务器 A 使用自己的私钥对消息进行签名,并生成签名。

假设服务器 B 收到整个 jwt,它将从服务器 A 获取公钥,并使用此公钥检查此 jwt 的消息部分是否与签名部分匹配。

如果 jwt 的消息部分被黑客更改,它将与签名不匹配。甚至黑客使用自己的私钥生成了一个新的签名,来自 A 的公钥不会验证这个消息-签名对。

【讨论】:

    【解决方案2】:

    JWT 令牌由三个对象构成,并通过以下方式通过基于 SHA256 哈希的消息身份验证代码 (A.K.A HMACSHA256):

    HEADER - 包含令牌的算法和类型(通常为JWT

    {
        "alg": "HS256",
        "typ": "JWT" 
    }
    

    PAYLOAD - 实际传递的数据,是无状态/自包含部分

    {
      "name": "John Doe"
    }
    

    最后,你的SECRET 变成了这样的东西(从jwt.io 提取)

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
    eyJuYW1lIjoiSm9obiBEb2UifQ.
    xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds
    

    很酷的是,现在,您的应用程序不需要在每次需要信息时都与其后端数据库进行交互,而是可以将其从JWT 令牌中提取出来。无论如何,一旦秘密或有效负载被篡改,签名就会失效。

    这是因为令牌通常是以需要您拥有私钥 (SECRET) 才能对其进行实际解码的方式进行签名和加密的。

    编辑:通过 SO 进行侦察后,我遇到了 Misch 提供的一个可爱的 example。我鼓励你阅读它!

    【讨论】:

    • 我知道它不能被篡改,但可以用新数据替换,包括为新数据计算的哈希值(使用黑客自己的私钥)?我的疑问是,如果我们最终没有密钥,我们如何确信它来自我们所期望的位置?
    • @CreativeManix - 我在答案中链接的示例解释了您的问题 - stackoverflow.com/questions/27301557/… JWT 只能在两个实体之间成功交换(自愿)。试图以任何方式篡改或更改密钥的第三方实体将无法做到这一点。这也产生了另一个问题。由于这是无状态的,用户如何更改有效负载值(例如他的个人资料名称)?如果用户真的是无状态的,你如何注销它?
    • 谢谢,是的,在问这个问题之前我确实看到了提供的 SO 链接,但我仍然不清楚。在示例中“......他们都知道一些共享的秘密......”。当发送者和接收者之间共享密钥时,我很清楚。因为 JWT 是自包含的,所以我看到了一些没有共享密钥的示例,数据被发送。示例:Azure b2c。在这些情况下如何验证?
    • Misch 的示例提到了 HS256(共享密钥),Azure B2C 使用 RS256(RSA 公钥/私钥)。 Azure B2C 有一个单独的 URL,您可以在其中下载公钥以检查 JWT
    • JWT 不应该用于发送加密数据,而是用于确保发送者的身份。
    猜你喜欢
    • 2018-09-12
    • 2016-05-09
    • 2017-02-05
    • 2019-12-15
    • 2013-02-15
    • 2015-08-05
    • 1970-01-01
    • 2018-12-04
    • 2013-08-04
    相关资源
    最近更新 更多