cryptography - 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}
如果我从 切换HS256
到RS256
,我现在得到这个令牌:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.TCYt5XsITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUcX16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtjPAYuNzVBAh4vGHSrQyHUdBBPM
它也可以很容易地用base64解码。所以,我的问题是,这是否是预期的行为?如果是,那么使用不同算法(HS256、RS256 等)的原因是什么,如果我们使用任何算法,我们都可以使用 base64 解码轻松读取内容?
解决方案
好吧,Jwt 并不意味着保护它用于验证声明的内容,即当您使用 jwt 签署请求时,在对其进行解码时,用户/系统必须具有密钥。因此,要回答您的问题,是的,这是预期的行为,base 64 编码仅用于通过 URL 传输而不是保护它。最后一点如果我可以澄清索赔的验证只是意味着你是什么/你告诉系统你是谁,并且签名的内容没有被改变甚至一点点,对编码的任何部分的任何更改签名会导致签名失败;因此,该主张将不再是真实的或真实的。要看到这一点,只需尝试在终端中编码这样的内容
import jwt
encoded=jwt.encode({'name':'some name'}, 'somesecretkey',algorithm='HS256')
然后复制生成的令牌,然后在字符串中删除或添加单个字母并尝试使用相同的密钥进行解码并观察它失败或再次在 codebeautify 尝试相同
推荐阅读
- ios - 出现错误:找不到框架 FirebaseCore
- mongoose - 使用猫鼬在输出中创建新字段
- arrays - 使用 julia script/print() 中的 shell Array 输出格式化的多维数组
- swagger - Swagger UI 未呈现 :: AspNetCore
- github - gtihub 桌面缺少 Index.lock
- unity3d - 附加添加场景,如何删除其中一些?
- dockerfile - 如何自动回答安装提示(“是”除外)?
- haskell - Acid-State 示例编译错误。否 (Control.Monad.Reader.Class.MonadReader FailureDb (Query FailureDb)) 没有实例
- excel - 运行时错误 1004 对象“_Global”的方法“范围”失败
- php - 在 php 中读取文本文件的前 3000 个字节