3

我了解 JWT 是安全的。但只是想知道一些我无法理解的概念。

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

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

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

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

header.user1email.signature

如果黑客将数据替换为

header.user2email.signature

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

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

4

2 回答 2

2

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

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

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

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

{
  "name": "John Doe"
}

最后,你SECRET喜欢这样的东西(来自jwt.io

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJuYW1lIjoiSm9obiBEb2UifQ.
xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds

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

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

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

于 2016-02-02T13:24:37.580 回答
0

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

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

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

于 2019-07-02T17:34:36.450 回答