点击蓝字
关注我们
始于理论,源于实践,终于实战
老付话安全,每天一点点
激情永无限,进步看得见
严正声明
本号所写文章方法和工具只用于学习和交流,严禁使用文章所述内容中的方法未经许可的情况下对生产系统进行方法验证实施,发生一切问题由相关个人承担法律责任,其与本号无关。
特此声明!!!
什么是 JWT
JWT(全称:Json Web Token)是一种标准化格式,用于在系统之间发送加密签名的 JSON 数据。它们可以包含任何类型的数据,但最常用于发送有关用户的信息(“声明”),作为身份验证、会话处理和访问控制机制的一部分。与传统会话令牌不同,服务器需要的所有数据都存储在 JWT 本身的客户端中。
JWT的结构
JWT 由 3 部分组成:标头、有效负载和签名。每个字段都由一个点分隔:
-
头部(Header):是一个描述JWT元数据的Json对象。其中alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64URL算法将上述JSON对象转换为字符串保存。
-
载荷(Payload):也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择,例如:
-
iss(issuer):签发人/发行人。
-
sub(subject):主题。
-
aud(audience):用户。
-
nbf(NotBefore):生效时间,在此之前是无效的。
-
iat(IssuedAt):签发时间。
-
jti(JWTID):用于标识该JWT。
3.签名(Signature):由头部信息和载荷信息经过特定算法加密得到,加密过程中需要一个密钥(secretKey),只有知道这个密钥才能进行正确的签名验证,这保证了JWT的安全性,防止被伪造,除非获取到secretKey,否则无法伪造JWT字符串。
示例:
头部通常包含两部分信息:令牌的类型(即JWT)和所使用的签名算法。例如:
{
"alg": "HS256",
"typ": "JWT"
}
使用Base64URL编码后的头部可能看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
载荷部分包含声明(claims),这些声明是关于实体(通常是用户)和其它数据。声明可以是标准的,也可以是自定义的。例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
使用Base64URL编码后的载荷可能看起来像这样:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvbmREb2UiLCJhZG1pbiI6dHJ1ZX0
签名部分是为了确保消息没有被篡改。它是由头部和载荷的Base64URL编码字符串,加上一个秘密(secret),通过算法生成的。例如,使用HMAC SHA256算法,签名可能是这样的:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), secret)
假设密钥是your-256-bit-secret,那么签名可能看起来像这样:
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
把这三部分连起来就是一个完整的JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvbmREb2UiLCJhZG1pbiI6dHJ1ZX0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
在大多数情况下,任何有权访问令牌的人都可以轻松读取或修改此数据。因此,任何基于 JWT 机制的安全性都严重依赖于加密签名。
JWT 签名
令牌的签名机制主要涉及对头部和有效负载进行哈希处理,并可能对生成的哈希值进行加密。
此机制为服务器提供了一种方法来验证令牌中的任何数据自颁发以来是否未被篡改:
由于签名是直接从令牌的其余部分派生的,因此更改标头或有效负载的单个字节会导致签名不匹配。
如果不知道服务器的签名密钥,就不可能为给定的标头或有效负载生成正确的签名。
JWT、JWS 和 JWE 的区别与联系
JWT 通常由三部分组成:
-
Header(头部):包含令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
-
Payload(载荷):包含声明,即要在双方之间传输的数据。声明可以是公有的、私有的或注册的。
-
Signature(签名):用于验证消息没有被篡改,并且在某些情况下还可以加密。
JSON Web Signature (JWS) 是 JWT 的一种实现方式,主要用于对 JWT 进行签名,以确保数据的完整性。JWS 通过对 JWT 的头部和载荷进行签名,使得接收方能够验证消息的来源和完整性。JWS 的结构包括:
-
Header(头部):包含签名算法等信息。
-
Payload(载荷):即 JWT 的载荷部分。
-
Signature(签名):使用指定的算法和密钥对头部和载荷进行签名。
JWS 的主要目的是防止数据在传输过程中被篡改,确保数据的完整性。
JSON Web Encryption (JWE)JWE 是 JWT 的另一种实现方式,主要用于对 JWT 进行加密,以增强数据的安全性。JWE 对 JWT 的头部和载荷进行加密,使得只有授权方才能解密和访问数据。JWE 的结构包括:
-
JOSE Header(JOSE 头部):包含加密算法等信息。
-
Encrypted Key(加密密钥):用于解密数据的密钥。
-
Initialization Vector(初始化向量):用于加密过程的随机值。
-
Ciphertext(密文):即加密后的载荷部分。
-
Authentication Tag(认证标签):用于验证数据的完整性。
JWE 的主要目的是保护敏感信息,防止数据在传输过程中被窃取或篡改。
J由此可知:WT 规范由 JSON Web 签名 (JWS) 和 JSON Web 加密 (JWE) 规范进行扩展,它们定义了实际实现 JWT 的具体方法。换句话说,JWT 通常是 JWS 或 JWE 令牌。一般特指JWS 令牌,而JWE 只是令牌的实际内容是加密的,而不仅仅是编码的。
END
老付
欢迎扫码
关注我们
网络安全
原文始发于微信公众号(老付话安全):JWT 基础知识详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论