0x00 前言
以前看到比较好的文章 看完之后没有认真总结和归纳导致过几天就忘记了所以便想到这个专题 对文章中个人不熟悉的内容进行学习和总结
文章地址: https://www.freebuf.com/vuls/211842.html
文章地址: https://www.freebuf.com/vuls/211847.html
文章来源: freebuf
文章作者: yangyangwithgnu
0x01 JWT
JWT 全名 JSON Web Token 这是跨域认证的比较好的解决方案
- 传统的基于session认证
用户将用户名和密码 发送给服务器
服务器验证通过之后把相应的用户数据等存入session
服务器向用户返回一个session_id 这里session_id 是在cookie中的
然后用户每一次请求的时候 都会通过 cookie 带上 session_id 然后服务器
服务器收到 session_id 找到之前的 数据 确认了 用户的身份
但是现在如果要跨域认证的话 使用这个方法就不是很方便 如果是服务器群的话就需要 session 数据的共享
- JWT 原理
鉴于上面的问题 服务器在认证之后会发回一段json 发回给用户 然后用户每次请求的时候都带上JWT 这样服务器就可以通过JWT来识别用户的身份了
- JWT 的结构
JWT 是 JSON 结构的 token,由三部分组成:1. header 2. payload 3. signature 每一段之间都是由 . 相连接而成 然后经过base64加密所得
但是第三段是签名 首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法 才可以获得到密钥
最后 JWT 的基本形式如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
第一段 也就是header 解码后的结果是这样的
{"alg":"HS256","typ":"JWT"}
Code language: JSON / JSON with Comments (json)
第二段 payload 解码后结果
{"sub":"1234567890","name":"John Doe","admin":true}
Code language: JSON / JSON with Comments (json)
第三段 signature 签名 我们正常情况下无法获取解密后的数据 因为如果我们可以自由控制这个第三段签名的话 那么我们就可以自由伪造身份了
这篇文章的作者 通过爆破的方式将密钥获取到 从而伪造了身份 变成了admin
- JWT 的使用方法
一般是在请求头里加入Authorization
,并加上Bearer
标注
服务端会验证token,如果验证通过就会返回相应的资源
文中利用JWT 是使用了 若密钥爆破 从而导致可以认为的改签名
参考文章
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html