对称加密与非对称加密在 JWT 中的应用详解

对称加密与非对称加密在 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 示例)

  1. 准备数据

    • Header:指定算法(“alg”: “HS256”)和类型(“typ”: “JWT”)。
    • Payload:存储实际数据(如用户信息、过期时间 exp)。
    • Secret Key:用于签名(仅签名方持有)。
  2. Base64Url 编码 Header 和 Payload

    • 将 Header 和 Payload 分别进行 Base64Url 编码,得到 encodedHeader 和 encodedPayload。
  3. 计算签名

    • 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
    • 使用 HMAC-SHA256 算法,对 signingInput 和 Secret Key 计算签名:signature = HMAC-SHA256(signingInput, SecretKey)。
    • 将签名进行 Base64Url 编码,得到 encodedSignature。
  4. 组合成 JWT

    jwt = encodedHeader + “.” + encodedPayload + “.” + encodedSignature

验证 JWT

  1. 解析 JWT
    • 分割 jwt 为 encodedHeader、encodedPayload 和 encodedSignature。
  2. 重新计算签名
    • 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
    • 使用相同的 HMAC-SHA256 算法和 Secret Key 计算签名。
  3. 比对签名
    • 比较重新计算的签名和 JWT 中的 encodedSignature 是否一致。
    • 如果一致,则验证通过;否则,验证失败。
  4. 验证其他声明(可选):
    • 检查 Payload 中的 exp(过期时间)、nbf(生效时间)等声明。

非对称加密生成和验证 JWT 的过程

生成 JWT(RS256 示例)

  1. 准备数据

    • Header:指定算法(“alg”: “RS256”)和类型(“typ”: “JWT”)。
    • Payload:存储实际数据(如用户信息、过期时间 exp)。
    • Private Key:用于签名(仅签名方持有)。
    • Public Key:用于验证(可公开分发)。
  2. Base64Url 编码 Header 和 Payload

    • 将 Header 和 Payload 分别进行 Base64Url 编码,得到 encodedHeader 和 encodedPayload。
  3. 计算签名

    • 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
    • 对signingInput进行哈希(如 SHA-256),然后用 RSA 私钥加密哈希值(生成签名):signature = RSA_Sign(SHA256(signingInput), PrivateKey)
    • 将签名进行 Base64Url 编码,得到 encodedSignature。
  4. 组合成 JWT

    jwt = encodedHeader + “.” + encodedPayload + “.” + encodedSignature

验证 JWT

  1. 解析 JWT
    • 分割 jwt 为 encodedHeader、encodedPayload 和 encodedSignature。
  2. 重新计算签名
    • 拼接字符串:signingInput = encodedHeader + “.” + encodedPayload。
    • 对 signingInput进行哈希(SHA-256),然后用 RSA 公钥解密 JWT 中的签名,比对哈希值是否一致:is_valid = RSA_Verify(SHA256(signingInput), encodedSignature, PublicKey)
  3. 比对签名
    • 如果解密后的哈希值与重新计算的哈希值一致,则验证通过;否则,验证失败。
  4. 验证其他声明(可选):
    • 检查 Payload 中的 exp(过期时间)、nbf(生效时间)等声明。

对称加密与非对称加密在 JWT 中的对比

特性对称加密(HS256)非对称加密(RS256/ES256)
密钥共享密钥(Secret Key)私钥签名,公钥验证
安全性较低(密钥共享)更高(私钥保密)
适用场景内部系统、简单应用分布式系统、OAuth/OpenID Connect
性能较快(HMAC 计算简单)较慢(RSA/ECDSA 计算开销大)
签名计算HMAC-SHA256RSA/ECDSA 签名
密钥管理密钥共享,风险较高私钥保密,公钥可公开分发

总结

  • 对称加密(HS256):
    • 使用相同的密钥进行签名和验证。
    • 适合内部系统,但密钥管理复杂。
  • 非对称加密(RS256/ES256):
    • 使用私钥签名,公钥验证。
    • 安全性更高,适合分布式系统(如 OAuth/OpenID Connect)。
  • 选择建议:
    • 如果安全性要求高,且系统是分布式的,优先选择非对称加密。
    • 如果是内部系统,且对性能要求较高,可以选择对称加密。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值