文章目录
对称加密与非对称加密在 JWT 中的应用详解
引言
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输声明(Claims)。JWT 通常由三部分组成:Header(头部)、Payload(载荷) 和 Signature(签名)。其中,签名 是 JWT 的核心,用于确保数据的完整性和真实性。
在 JWT 中,签名可以使用 对称加密(如 HS256) 或 非对称加密(如 RS256) 生成。本文将详细介绍这两种加密方式的区别,并深入讲解它们在 JWT 生成和验证过程中的具体实现。
对称加密与非对称加密概述
对称加密(Symmetric Encryption)
- 定义:加密和解密使用相同的密钥。
- 特点:
- 效率高:计算速度快,适合加密大量数据。
- 密钥管理复杂:通信双方必须共享同一密钥,密钥分发存在风险。
- 常见算法:AES(高级加密标准)、DES(数据加密标准)、3DES、ChaCha20。
- 应用场景:数据库加密、文件加密、VPN 通信(如 IPsec)、硬盘加密(如 BitLocker)。
非对称加密(Asymmetric Encryption)
- 定义:使用一对密钥(公钥和私钥),公钥加密的数据只能用私钥解密,反之亦然(部分算法支持签名功能)。
- 特点:
- 安全性高:无需共享私钥,公钥可公开分发。
- 计算开销大:速度比对称加密慢,通常用于小数据量或密钥交换。
- 常见算法:RSA、ECC(椭圆曲线加密)、ElGamal、DH(Diffie-Hellman,密钥交换协议)。
- 应用场景:数字签名、SSL/TLS 握手、SSH 登录、加密货币(如比特币)。
注意:在jwt中,使用对称加密和非对称加密不是用来加密的,是用来计算签名的
对称加密生成和验证 JWT 的过程
生成 JWT(HS256 示例)
-
准备数据:
- Header:指定算法(“alg”: “HS256”)和类型(“typ”: “JWT”)。
- Payload:存储实际数据(如用户信息、过期时间 exp)。
- Secret Key:用于签名(仅签名方持有)。
-
Base64Url 编码 Header 和 Payload:
- 将 Header 和 Payload 分别进行 Base64Url 编码,得到 encodedHeader 和 encodedPayload。
-
计算签名:
- 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
- 使用 HMAC-SHA256 算法,对 signingInput 和 Secret Key 计算签名:signature = HMAC-SHA256(signingInput, SecretKey)。
- 将签名进行 Base64Url 编码,得到 encodedSignature。
-
组合成 JWT:
jwt = encodedHeader + “.” + encodedPayload + “.” + encodedSignature
验证 JWT
- 解析 JWT:
- 分割 jwt 为 encodedHeader、encodedPayload 和 encodedSignature。
- 重新计算签名:
- 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
- 使用相同的 HMAC-SHA256 算法和 Secret Key 计算签名。
- 比对签名:
- 比较重新计算的签名和 JWT 中的 encodedSignature 是否一致。
- 如果一致,则验证通过;否则,验证失败。
- 验证其他声明(可选):
- 检查 Payload 中的 exp(过期时间)、nbf(生效时间)等声明。
非对称加密生成和验证 JWT 的过程
生成 JWT(RS256 示例)
-
准备数据:
- Header:指定算法(“alg”: “RS256”)和类型(“typ”: “JWT”)。
- Payload:存储实际数据(如用户信息、过期时间 exp)。
- Private Key:用于签名(仅签名方持有)。
- Public Key:用于验证(可公开分发)。
-
Base64Url 编码 Header 和 Payload:
- 将 Header 和 Payload 分别进行 Base64Url 编码,得到 encodedHeader 和 encodedPayload。
-
计算签名:
- 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
- 对signingInput进行哈希(如 SHA-256),然后用 RSA 私钥加密哈希值(生成签名):signature = RSA_Sign(SHA256(signingInput), PrivateKey)
- 将签名进行 Base64Url 编码,得到 encodedSignature。
-
组合成 JWT:
jwt = encodedHeader + “.” + encodedPayload + “.” + encodedSignature
验证 JWT
- 解析 JWT:
- 分割 jwt 为 encodedHeader、encodedPayload 和 encodedSignature。
- 重新计算签名:
- 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
- 对 signingInput进行哈希(SHA-256),然后用 RSA 公钥解密 JWT 中的签名,比对哈希值是否一致:is_valid = RSA_Verify(SHA256(signingInput), encodedSignature, PublicKey)
- 比对签名:
- 如果解密后的哈希值与重新计算的哈希值一致,则验证通过;否则,验证失败。
- 验证其他声明(可选):
- 检查 Payload 中的 exp(过期时间)、nbf(生效时间)等声明。
对称加密与非对称加密在 JWT 中的对比
特性 | 对称加密(HS256) | 非对称加密(RS256/ES256) |
---|---|---|
密钥 | 共享密钥(Secret Key) | 私钥签名,公钥验证 |
安全性 | 较低(密钥共享) | 更高(私钥保密) |
适用场景 | 内部系统、简单应用 | 分布式系统、OAuth/OpenID Connect |
性能 | 较快(HMAC 计算简单) | 较慢(RSA/ECDSA 计算开销大) |
签名计算 | HMAC-SHA256 | RSA/ECDSA 签名 |
密钥管理 | 密钥共享,风险较高 | 私钥保密,公钥可公开分发 |
总结
- 对称加密(HS256):
- 使用相同的密钥进行签名和验证。
- 适合内部系统,但密钥管理复杂。
- 非对称加密(RS256/ES256):
- 使用私钥签名,公钥验证。
- 安全性更高,适合分布式系统(如 OAuth/OpenID Connect)。
- 选择建议:
- 如果安全性要求高,且系统是分布式的,优先选择非对称加密。
- 如果是内部系统,且对性能要求较高,可以选择对称加密。