首页 > 解决方案 > Json Web 令牌是否足够安全?以及如何保护有效载荷?

问题描述

当我转到https://jwt.io时,我看到了这个编码的令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

如果我去https://codebeautify.org/base64-decode,复制粘贴令牌值并 push Decode,我会得到:

{"alg":"HS256","typ":"JWT"}{"sub":"1234567890","name":"John Doe","iat":1516239022}

如果我从 切换HS256RS256,我现在得到这个令牌:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM

它也可以很容易地用base64解码。所以,我的问题是,这是否是预期的行为?如果是,那么使用不同算法(HS256、RS256 等)的原因是什么,如果我们使用任何算法,我们都可以使用 base64 解码轻松读取内容?

标签: cryptographyjwt

解决方案


好吧,Jwt 并不意味着保护它用于验证声明的内容,即当您使用 jwt 签署请求时,在对其进行解码时,用户/系统必须具有密钥。因此,要回答您的问题,是的,这是预期的行为,base 64 编码仅用于通过 URL 传输而不是保护它。最后一点如果我可以澄清索赔的验证只是意味着你是什么/你告诉系统你是谁,并且签名的内容没有被改变甚至一点点,对编码的任何部分的任何更改签名会导致签名失败;因此,该主张将不再是真实的或真实的。要看到这一点,只需尝试在终端中编码这样的内容
import jwt encoded=jwt.encode({'name':'some name'}, 'somesecretkey',algorithm='HS256') 然后复制生成的令牌,然后在字符串中删除或添加单个字母并尝试使用相同的密钥进行解码并观察它失败或再次在 codebeautify 尝试相同


推荐阅读