原文链接:基础14-JWT简述
目录
1.何为JWT2.JWT的组成2.1 header部分2.1 claims部分(也叫payload)2.3 Signature(签名部分)3.JWT漏洞点及攻击方向3.1Header方面3.2 Payload方面3.3 Signature方面3.4 其他方面4.JWT认证流程图
1、何为JWT
JWT(JSON Web Token),它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。
在互联网领域中,JWT适用领域非常普遍,其主要使用场景有:
2、JWT的组成
JWT由三部分组成,header.claims.signature
Header: 存放Token类型和加密的方法
Payload: 包含一些用户身份信息.
Signature: 签名是将前面的Header,Payload信息以及一个密钥组合起来并使用Header中的算法进行加密
2.1 header部分格式如下:
在头部指明了签名算法是HS256算法。
当然头部也要进行BASE64编码,编码后的字符串如下:
2.1 claims部分(也叫payload)这里主要是存放有效信息,这些信息按照职能可以分成三个部分。标准的注册声明,公共的声明,私有的声明。
这里我们主要了解一些我们常见的数据信息
将上面的JSON对象进行base64编码可以得到紫色的字符串。这个字符串我们将它称作JWT的Payload(载荷)。
2.3 Signature(签名部分)服务器有一个不会发送给客户端的密钥(secret)。
首先这个部分需要BASE64加密后的header和payload,然后使用进行连接组成的字符串,然后通过header中指定的加密方式,进行加盐值secret组合加密,然后就构成了JWT的第三部分。
所以一个完整的JWT数据就是这样的,如下图
3、JWT漏洞点及攻击方向
3.1Header方面是否支持修改算法为none/对称加密算法
是否可以删除签名
插入错误信息
kid字段是否有SQL注入/命令注入/目录遍历
jwt元素是否可信
是否强制使用白名单上的加密算法 3.2 Payload方面其中是否存在敏感信息检查过期策略,比如 exp, iat 3.3 Signature方面检查是否强制检查签名
密钥是否可以爆破(如HMAC)
是否可以通过其他方式拿到密钥
采用了自身存在脆弱性的算法(如ECDH-ES)
签名方法之间是否存在冲突 3.4 其他方面重放
通过匹配校验的时间做时间攻击
修改算法非对称算法为对称算法(如修改RS256为HS256)【CVE-2015-9235】 不安全的配置所导致的敏感信息泄露(如在报错信息中泄露签名)
好文推荐:攻击JWT的一些方法 - 先知社区 (aliyun.com)https://xz.aliyun.com/t/6776#toc-8
4、JWT认证流程图
1、用户端登录,用户名和密码在请求中被发往服务器
2、(确认登录信息正确后)服务器生成 JSON 头部和声明,将登录信息写入 JSON 的声明中(通常不
应写入密码,因为 JWT 是不加密的),并用 secret 用指定算法进行加密,生成该用户的 JWT。此时,
服务器并没有保存登录状态信息。
3、服务器将 JWT(通过响应)返回给客户端
4、用户下次会话时,客户端会自动将 JWT 写在 HTTP 请求头部的 Authorization 字段中
5、服务器对 JWT 进行验证,若验证成功,则确认此用户的登录状态
6、服务器返回响应
|