JWT 简要介绍 ¶
介绍 ¶
jwt(JSON Web Token) 是一串 json 格式的字符串,由服务端用加密算法对信息签名来保证其完整性和不可伪造。Token 里可以包含所有必要信息,这样服务端就无需保存任何关于用户或会话的信息,JWT 可用于身份认证、会话状态维持、信息交换等。它的出现是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519). 该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
一个 jwt token 由三部分组成,header、payload 与 signature,以点隔开,形如aaaa.bbbb.cccc
。
一个具体的例子:
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3sic3ViIjoidXNlciJ9XQ
- header 用来声明 token 的类型和签名用的算法等,需要经过 Base64Url 编码。比如以上 token 的头部经过 base64 解码后为
{"alg":"HS256","typ":"JWT"}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 解码为 { "alg": "HS256", "typ": "JWT" } alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256); typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
- payload 用来表示真正的 token 信息,也需要经过 Base64Url 编码。比如以上 token 的 payload 经过解码后为
{"sub":"1234567890","name":"John Doe","iat":1516239022}
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 解码为 { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } JWT 规定了7个官方字段,供选用 iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号
- signature,将前两部分用
alg
指定的算法加密,再经过 Base64Url 编码就是 signature 了,作用是防止数据篡改。
解码 ¶
一般推荐去http://jwt.io/
解码,拿上面这个例子
解密前
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3sic3ViIjoidXNlciJ9XQ
解密后
{ "alg": "None", "typ": "jwt" } [ { "sub": "user" } ]
JWT 的安全问题 ¶
1.修改算法为none 2.修改算法从RS256到HS256 3.信息泄漏 密钥泄漏 4.爆破密钥
存在的漏洞 ¶
- CVE-2015-9235 Alg:无攻击
- CVE-2016-5431 密钥混淆攻击
- CVE-2018-0114 密钥注入攻击 其他已知攻击
- JWKS 欺骗
- “kid” 注射
- 跨服务中继攻击
- 弱密钥