为啥即使我没有在 Jwt.io 中提供秘密(签名),jwt 令牌也会显示有效负载?

Posted

技术标签:

【中文标题】为啥即使我没有在 Jwt.io 中提供秘密(签名),jwt 令牌也会显示有效负载?【英文标题】:Why jwt token shows payload even i didn't provide secret (Signature ) in Jwt.io?为什么即使我没有在 Jwt.io 中提供秘密(签名),jwt 令牌也会显示有效负载? 【发布时间】:2020-01-30 18:25:03 【问题描述】:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjIsImlhdCI6MTU2ODY1NjI1OX0.E2TNtWjqyPC-4myEom6leLJgE96ZlQOq0-mcBr3p5QU

如果我们将使用 JsonWebToken 从我的代码生成的令牌放置在 Jwt.io 站点中,即使我没有提供要验证的密码,它也会立即解码。 我不知道为什么它显示。有人能解释一下原因吗?

--那么Jwt中SECRET的作用是什么?

【问题讨论】:

查看“无效签名”的位置...现在输入您的密码,然后粘贴您的令牌,瞧,有效 但最后我们需要在有效载荷中获取数据,对吧??那如果不提供签名呢 什么?数据未加密,因为客户端可能需要读取它......但客户端在将其发送回服务器时无法更改它,因为知道秘密的服务器应该验证它 - 换句话说, JWT 的验证仅在服务器上完成,以确保客户端没有更改令牌 哦!谢谢你的快速回复知道了!! 我想你可能需要看看网上的 jwt 解释 【参考方案1】:

我认为您对加密和签名有点困惑。

JSON 网络令牌没有加密,它只是 base64 编码,这意味着任何人都可以轻松解码和查看。

但是它是经过签名的,这意味着它有一个基于其中的所有信息和一个密钥生成的hash。只有拥有密钥(用于对称散列)或公钥(用于非对称散列)的人才能确认令牌已正确散列,并且只有密钥的提供者(拥有秘密令牌)才能创建有效的哈希值。

这样做的目的是让您确信令牌是由您认为创建它的人/服务创建的,防止冒充等,因此允许您信任在令牌中创建的 claims。如果该哈希因任何原因无效,您将立即拒绝该令牌,因为它很可能是伪造的。

请注意,正如@FlorentMorselli 所提到的,有一种称为JWE 的加密令牌。

【讨论】:

投赞成票,但需要提一下JWT可以加密。 JWS 未加密,但 JWE 加密(请参阅 RFC 7516)。 @FlorentMorselli 感谢分享 - 我不知道 JWE 的!

以上是关于为啥即使我没有在 Jwt.io 中提供秘密(签名),jwt 令牌也会显示有效负载?的主要内容,如果未能解决你的问题,请参考以下文章

JWT:验证签名秘密格式。

如何生成与 JWT.IO 网站相同的签名?

使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名

如何使用 JWT.IO 网站创建 RS256 JWT?

.NET 库中的 JWT 无效签名

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌