JWT、JWS 与 JWE
以前 WEB 网站认证方式都是基于传统的服务器 session+浏览器 cookie 的 Auth 手段,近年来 Web 网站认证方式逐步转变为基于 OAuth2 等开放协议的 SSO 模式。其中 Json Web Token(简称 JWT) 成为当前热门的 Token Auth 机制。
那么什么是 JWT 呢?JWT 是一个轻量级的 OAuth2 规范,允许我们使用 JWT 在两个或多个组织之间安全可靠的传递数据。通俗的说 JWT 其实就是在易碎品外包了层气泡膜,保护数据不会被破坏和破解。
我们通常在网络上所看到的关于 JWT 讲解的文章大多是讲解的是 JWS,因此导致需对人对 JWT 产生了误解,其实 JWS 并不是 JWT,它只是 JWT 的一种实现方式。一般常见的 JWT 实现有 JWS 和 JWE,下面我们来看一下什么是 JWS 和 JWE。
JWS
JWS 全称是 Json Web Signatura,是一个简单的统一表达形式的字符串。这个字符串中包含 Header、Payload 和 Signtrue.
其中,Header 用于描述 JWT 的基本信息,一般包含 Type(类型)和 alg(签名所用的算法),Header 的算法必须经过 Base64 编码。
Payload 包含 5 个字段,这 5 个字段都是由 JWT 定义的:
- iss:JWT 签发者;
- sub:JWT 面向的用户;
- aud:JWT 的接收方;
- exp:unix 时间戳定义的过期时间;
- iat:签发时间
- ....(后面的内容按需补充)
同样,Payload 内容也需要经过 Base64 编码。
Signature 这个部分的内容是 Header+Payload 内容,并经过加密后的字符串。加密方式则是 Header 中所声明的签名方式。
JWS 的目的主要是保证数据在传输过程中不被修改,验证数据的完整性,但是由于使用 Base64 对消息进行编码,因此无法保证数据不泄露,所以一般不会用它传输敏感数据。
JWE
为了保证数据的安全性与完整性,JWE 出现了。JWE 包含 5 部分:JOSE Header、JWE Encrypied Key、Initialization Vector、Ciphertext 和 Authentication Tag。JWE 的生成步骤如下:
- JOSE 与 JWS Header 一样;
- 生成随机的 Content Encryption Key;
- 使用 RSAES-OAEP 算法,并使用公钥加密 CEK,生成 JWE Encrypted Key;
- 生成 JWE 初始化向量;
- 使用 AES GCM 算法对铭文部分加密,生成密问 Ciphertext,同时 AES GCM 算法也会生成一个 128 位的认证标记 Authentication Tag;
- 对以上 5 部分分别进行 Base64 编码,并用点号拼接在一起。
从前面的 5 各步骤可以看出 JWE 的生成以及计算过程相对复杂不够轻量,因此它比较适合在数据传输上使用,不建议在 token 认证中使用。
版权声明: 本文为 InfoQ 作者【喵叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/0546d3ad57c85f385c1a6c157】。未经作者许可,禁止转载。
评论