【发布时间】:2021-12-31 01:46:56
【问题描述】:
为什么 JWT 比散列密码更重要?
所以我已经阅读了一些关于 JWT 机制的文章,我很确定我可以说我已经掌握了这个概念。
我们在服务器端确实有密钥。 我们得到 base64encrypted (heade.payload) - 并且通过整个事情我们验证我们从客户端获得的令牌是否有效。
嗯,到目前为止一切顺利。 但是,由于客户端可以读取负载(通过 decode64..),他可以更改负载并使用其他负载进行验证。
假设我有一个经过验证的令牌,这个令牌也存储在我的数据库中的“x”用户中。 现在我想更改我的用户(用户“x”)的电子邮件。 我可以(作为系统开发人员)只信任匹配的令牌(用户“x”中的 db 令牌和客户端发送的令牌)吗?或者我们是否需要更多的额外检查,例如电子邮件+密码? 问题是令牌值在 X 小时后不再有效?
我看到了一些例子,客户在通过 JWT 进行身份验证后 - 还需要提供电子邮件和密码以真正检查凭据是否正确......所以我们在这里所做的更多,然后只是在之前添加了一些额外的弱屏障数据库和客户端凭据的真正身份验证?
如果令牌用于加密用户凭据 - 因为任何获得签名令牌的人都可以读取有效负载,为什么不直接使用 cookie 或类似的东西保存凭据(电子邮件+密码)?
我在这里错过了什么?
################
编辑-
为了更清楚: 所以假设有这样一个场景: 用户进入他的私人个人区域以查看他收到的消息。 它使用“header.payload.secret”的TOKEN向“/api/my-profile”发送一个API请求。 系统确实验证了——现在好了,用户确实提供了正确的令牌。 现在我的问题是 -
- 系统是否可以信任这里的用户(因为TOKEN已经过认证),并根据用户请求的PAYLOAD(比如{user_id: 10})为他检索私信?
或
- 系统,即使它已经验证了 TOKEN 是有效的,还需要进一步验证用户确实是他所说的那个人 (user_id = 10)? 为了验证这一点,我认为她必须使用 id / email(唯一的东西)获取用户的加密密码?
据我了解,案例 2 是正确的,因为在案例 1 中肯定存在严重的安全问题(因为任何用户,即使经过验证,也可以请求其他用户的详细信息)。
--
这是 2 个经过验证的 JWT,仅更改了有效负载: 1 - https://jwt.io/#debugger-io?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTAiLCJwYXNzd29yZCI6ImFiYyJ9.BoiVLHPTCtpcp7P9BIan9ZptJHvxUlOmoAoAUqHvjJE
希望我的问题在这里得到更多的理解
【问题讨论】:
-
这能回答你的问题吗? If you can decode JWT, how are they secure?
-
base64encrypted - Base64 是一种编码算法,它并不意味着加密任何东西。 - 由于客户端可以读取有效负载,他可以更改有效负载并使用其他有效负载进行验证 - 不,因为修改后的令牌将无效。另请参阅链接的 Q/A。
-
当您在 jwt.io 调试器中有令牌时,您可以随意更改并获得经过验证的签名,即使您没有提供秘密或密钥。请参阅here 如何真正验证 jwt.io 上的签名。但是,如果您有一个使用未知密钥签名的令牌,则不可能更改令牌中的任何内容并欺骗该令牌的原始发行者。在不知道密钥的情况下,您无法创建有效的签名(即对颁发者的私钥有效)
标签: authentication jwt