当前位置: 首页 > web >正文

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

文章目录

  • 对称加密与非对称加密在 JWT 中的应用详解
    • 引言
    • 对称加密与非对称加密概述
      • 对称加密(Symmetric Encryption)
      • 非对称加密(Asymmetric Encryption)
    • 对称加密生成和验证 JWT 的过程
      • 生成 JWT(HS256 示例)
      • 验证 JWT
    • 非对称加密生成和验证 JWT 的过程
      • 生成 JWT(RS256 示例)
      • 验证 JWT
    • 对称加密与非对称加密在 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

    • HeaderPayload 分别进行 Base64Url 编码,得到 encodedHeaderencodedPayload
  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
    • 分割 jwtencodedHeaderencodedPayloadencodedSignature
  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

    • HeaderPayload 分别进行 Base64Url 编码,得到 encodedHeaderencodedPayload
  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
    • 分割 jwtencodedHeaderencodedPayloadencodedSignature
  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)。
  • 选择建议:
    • 如果安全性要求高,且系统是分布式的,优先选择非对称加密。
    • 如果是内部系统,且对性能要求较高,可以选择对称加密。
http://www.xdnf.cn/news/7209.html

相关文章:

  • C++模板进阶使用技巧
  • el-scrollbar 获取滚动条高度 并将滚动条保持在低端
  • mysql数据库故障排查方案
  • 批量处理 Office 文档 高画质提取图片、视频、音频素材助手
  • httpx[http2] 和 httpx 的核心区别及使用场景如下
  • C++ map multimap 容器:赋值、排序、大小与删除操作
  • 【深度学习】残差网络(ResNet)
  • 图书管理系统
  • 滑动窗口算法详解与C++实现
  • 【背包dp】小结
  • 20250518 黎曼在三维空间中总结的一维二维的规律,推广到高维度合适吗?有没有人提出反对意见
  • Power BI Desktop运算符和新建列
  • 职场方法论总结(3)-金字塔原理
  • Redis的持久化机制
  • 深入探索PointNet:点云处理的革命性算法
  • 【MySQL】02.数据库基础
  • 安装和升级到devExpress23.1.7
  • #Redis黑马点评#(七)实战篇完结
  • 2025 ISCC 练武赛Pwn-wp(含附件)
  • 知识图谱(KG)与大语言模型(LLM)
  • 《算法导论(第4版)》阅读笔记:p83-p85
  • buck变换器的simulink/matlab仿真和python参数设计
  • 互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
  • 进程概念及操作系统的知识点
  • 基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计
  • React方向:react的基本语法-数据渲染
  • 备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数
  • 【CF】Day61——Codeforces Round 939 (Div. 2) CD (思维构造 | 思维构造 + dfs枚举)
  • Python实例题:基于scrapy爬虫的天气数据采集
  • 构建 TypoView:一个富文本样式预览工具的全流程记录