【发布时间】:2021-10-28 21:15:17
【问题描述】:
我是在网络应用程序上使用 JWT 的新手。 我不确定应该在 JWT 中存储哪些信息,但就我而言,我正在保存敏感的用户数据,例如电子邮件和用户名。我希望在我的 JWT 上安全地保护这些信息。
使用pyjwt 模块,我能够成功创建我的令牌。这是我一直在使用它的示例。
import jwt
from datetime import datetime, timedelta
data = {
"user": {}, # Here I would fill with my user data.
"exp": datetime.utcnow() + timedelta(hours=2)
}
jwt.encode(data,"my-super-secret-key", "HS256")
上面的这段代码返回一个我认为是加密的令牌。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjp7fSwiZXhwIjoxNjMwMzAxMjI4fQ.sF3NeOArV5Mkgz9oemNMA4-RPF-mXKCIkQrlMQPLMV4
使用https://jwt.io/ JWT 检查器,我发现我的令牌实际上是在没有使用my-super-secret-key 的情况下被“解密”的。这让我想知道 PyJWT 中密钥的目的是什么。我的猜测是它只是为了签署令牌。
我如何才能真正保护我的 JWT 令牌? (我读过有关 JWE 的文章,但还不太了解,非常感谢简明的解释)
【问题讨论】:
-
A JWT 是一个经过签名的令牌(某种数据),并且接收者能够证明签名。您需要的是一个名为 JWE 的加密版本。您的 Python 库似乎不支持 JWE,因此您需要更改库。在jwt.io 上,您会发现很多支持 JWE 的库,对于我的跨平台项目,我选择了 authlib (github.com/lepture/authlib)。示例代码在这里(免责声明:我是作者):github.com/java-crypto/cross_platform_crypto/blob/main/…
-
非常感谢您的回复!我读过 JWE,但我在加密算法上苦苦挣扎。我将深入研究加密算法,以便了解如何正确编码我的数据!谢谢!