JWT 签名用对称加密还是非对称加密?

一 概念梳理

对称加密和非对称加密是两种基本的加密方法,它们在现代密码学中扮演着核心角色,用于保护数据的安全和隐私。

1.1 对称加密(Symmetric Encryption)

对称加密是指加密和解密使用同一个密钥的过程。这意味着发送方和接收方都必须知道并使用这个共享的密钥来对信息进行加密和解密。这种方法的优点在于加密和解密速度快,效率高,适合处理大量数据。但是,安全分发密钥成为一个挑战,因为如果密钥在传输过程中被截获,那么加密的信息就可能被破解。常用的对称加密算法有 DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。

1.2 非对称加密(Asymmetric Encryption)

非对称加密则使用一对密钥,分别是公钥(Public Key)和私钥(Private Key)。公钥可以公开给任何人,用于加密信息;而私钥必须保密,仅由信息的接收者持有,用于解密信息。这种机制解决了密钥分发的问题,因为即使公钥被广泛传播,只要私钥保持安全,信息仍然是安全的。非对称加密的计算复杂度较高,速度相对较慢,因此通常用于加密小量的数据,或者用来安全地交换对称加密的密钥。常见的非对称加密算法有 RSA、DSA(Digital Signature Algorithm)、ECC(Elliptic Curve Cryptography)等。

对称加密适用于数据的快速加密和解密,但需要安全的密钥管理机制;而非对称加密提供了更好的安全性,尤其在密钥交换方面,尽管其加密和解密过程比对称加密更耗时。在实际应用中,这两种加密方式常常结合使用,例如在 HTTPS 的处理中。

二 JWT

2.1 JWT 简介

JSON Web Token(JWT)是一种轻量级、自包含的安全标准,用于在各方之间安全地传输信息。它以 JSON 对象的形式存在,包含三个部分:Header(头部)、Payload(载荷)和Signature(签名)。JWT 被广泛应用于认证、授权和信息交换场景,如单点登录(SSO)、API 安全认证等。

JWT 的优势在于:

  • 无状态性:服务器无需存储会话信息,降低了服务器负担。
  • 自包含:所有必要信息直接包含在 JWT 中,便于跨域传输。
  • 安全性:通过签名机制确保数据的完整性和防篡改。

2.2 JWT 如何防篡改

JWT 通过其内置的签名机制来防止数据被篡改,确保消息的完整性和真实性。JWT 的结构分为三部分:Header、Payload 和 Signature。签名部分正是 JWT 防止篡改的关键所在,其生成和验证流程如下:

签名生成过程

  1. Header 和 Payload 编码:首先,JWT 的 Header 和 Payload 分别被 Base64Url 编码,形成两段字符串。Header 包含了关于 JWT 的元数据,如签名算法类型;Payload 则包含了实际要传输的数据,如用户标识、过期时间等。

  2. 签名数据准备:将编码后的 Header 和 Payload 通过 . 连接起来形成一个字符串,这个字符串与用于签名的密钥(可以是对称密钥或私钥,依据所选签名算法而定)一起作为签名的输入。

  3. 签名计算:根据 Header 中声明的签名算法(如 HMAC SHA256、RSA、ECDSA 等),使用密钥对上述拼接的字符串进行加密计算,产生一个签名字符串。

  4. 组合 JWT:最后,将 Base64Url 编码的 Header、Payload 和新产生的 Signature 通过 . 连接,形成完整的 JWT 字符串。

防篡改验证过程

  1. 接收 JWT:接收方首先解析 JWT,将其分割成 Header、Payload 和 Signature 三部分。

  2. 签名验证:再次对 Header 和 Payload 进行 Base64Url 解码,并使用声明的签名算法和相应的密钥(如果是对称加密,则与签名时使用的密钥相同;如果是非对称加密,则使用与私钥配对的公钥)对这两部分数据进行计算,生成一个新的签名字符串。

  3. 比较签名:将新生成的签名与 JWT 中携带的原始 Signature 进行对比。如果两者完全一致,则说明在传输过程中 JWT 没有被篡改,其内容是完整且真实的;若不一致,则表明 JWT 可能被篡改或不是由预期的发送方发出。

三 选择那种签名方案

根据上面的介绍,在签名的时候存在两类不同的签名方式:对称加密和非对称加密。

选择使用共享密钥(HMAC)还是公私钥对(如RSA、ECDSA)来签名 JWT 取决于具体的应用场景和安全需求。

3.1 共享密钥(HMAC)

优点

  • 实现简单:相较于公私钥对,使用共享密钥进行签名和验证的实现更为直接和快速。
  • 计算效率高:HMAC 算法的计算速度通常比 RSA 等非对称加密算法快,适合对性能有较高要求的场景。
  • 密钥管理相对简单:只需保护好一个密钥即可,减少了密钥管理的复杂度。

缺点

  • 密钥分发风险:所有需要验证 JWT 的服务都需要访问这个共享密钥,增加了密钥泄露的风险。
  • 不支持非对称操作:无法实现 JWT 的签发者和服务验证者之间的分离,因为双方都需要知道相同的密钥。

3.2 公私钥对

优点

  • 增强安全性:私钥保持在签发者一方,公钥可以公开,即使 JWT 在传输过程中被截取,没有私钥也无法伪造 JWT,提高了安全性。
  • 分离权限:可以实现签发和验证的职责分离,例如,认证服务器使用私钥签发 JWT,而各个服务使用公钥验证,无需共享私密信息。
  • 更灵活的架构设计:适用于分布式系统,特别是当有多个服务需要验证 JWT,但不应知道用于签名的私钥时。

缺点

  • 实现复杂度:公私钥的管理和使用相比 HMAC 更复杂,尤其是在密钥的生成、存储和更新方面。
  • 性能开销:非对称加密算法的计算成本高于对称加密,可能影响到大规模系统中的性能。

四 小结

如果你的应用场景对性能要求较高,且信任环境较为封闭,可以考虑使用共享密钥。

若你需要更高的安全性,或者在分布式系统中需要明确分离 JWT 的签发和验证权限,公私钥对会是更好的选择,尽管它在实现和性能上可能带来一些挑战。

如果小伙伴们想要彻底掌握 Spring Security+OAuth2,那么可以看看松哥最近录制的这套全新的视频教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

!力扣 108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵 平衡二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案…

封装了一个使用UICollectionViewLayout 实现的吸附居左banner图

首先查看效果图 实现的原理就是通过自定义UICollectionView layout,然后 设置减速速率是快速就可以达到吸附的效果 _collectionView.decelerationRate UIScrollViewDecelerationRateFast; 下面贴出所有代码 这里是.h // // LBMiddleExpandLayout.h // Liubo…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《具有源荷不平衡特性的配电网智能软开关和储能联合规划》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

CTF_RE学习

学了一个 map()函数的使用 import base64rawData "e3nifIH9b_CndH" target list(map(ord, rawData)) # map 函数将 rawData 中的每个字符传递给 ord 函数。ord 函数返回给定字符的 Unicode 码点 print(target) # 打印 map 对象的内存地址&…

汽车线束搭铁与接地

一、搭铁与接地的概念 首先在这里解释一下“搭铁”与“接地”的概念,不要混为一团! 先说接地,大地是可导电的,其电位通常取为零。电力系统和电气装置的中性点、电气设备的外露导电部分及装置外导电部分通过导体与大地相连&#xf…

MySQL数据库的约束

MySQL对于数据库存储的数据, 做出一些限制性要求, 就叫做数据库的"约束". 在每一列的 列名, 类型 后面加上"约束". 一. not null (非空) 指定某列不能存储null值. 二. unique (唯一) 保证这一列的每行必须有唯一值. 我们可以看到, 给 table 的 sn 列插…

【微服务】docker部署redis,一主二从三哨兵,读写分离

配置redis读写分离 3台虚拟机 创建目录用于挂载 mkdir -p /root/redis/{conf,data,logs} #master配置文件 bind 0.0.0.0 //任何ip都能访问 port 6379 //redis端口号 logfile "/data/redis.log" //日志文件存放位置,启动redis之前设置为空&#xff…

prometheus docker部署

1.安装Docker sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors":["https://hub-mirror.c.163.com"] } EOF export DOWNLOAD_URL"https://hub-mirror.163.com/docker-ce" curl -fsSL https://ge…

TypeScript 中的声明合并

1. 声明合并的概念 声明合并是指当 TypeScript 遇到多个同名的声明时&#xff0c;会将它们合并为一个单一的声明。这使得开发者可以分散地定义同一个实体的不同部分&#xff0c;最终将它们合并为一个整体。在进行声明合并时&#xff0c;TypeScript 会根据不同类型的声明进行不…

【LIN】STM32新能源汽车LIN通信实现过程

【LIN】STM32新能源汽车LIN通信实现过程 文章目录 前言一、软件二、接线图三、硬件原理图四、上位机五、PICO示波器串行解码1.软件中的LIN波特率设置-192002.PIC设置3.PIC串行解码 六.引用总结 前言 【电机控制】直流有刷电机、无刷电机汇总——持续更新 使用工具&#xff1a;…

godot.bk

1.搜索godot国内镜像&#xff0c;直接安装&#xff0c;mono是csharp版本 2.直接解压&#xff0c;50m&#xff0c;无需安装&#xff0c;直接运行 3.godot里分为场景&#xff0c;节点 主场景用control场景&#xff0c;下面挂textureact放背景图片&#xff0c;右键实例化子场景把…

961题库 北航计算机 计算机网络 附答案 简答题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 某网络拓扑如题下图所示&#xff0c;其中 R 为路由器&#xff0c;主机 H1&#xff5e;H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机…

Python高效遍历文件和目录的方法

在 Python 中&#xff0c;遍历文件和目录可以使用 os、pathlib 等模块。以下是一些高效遍历文件和目录的方法&#xff1a; 使用 os.walk() os.walk() 是一个高效的递归遍历指定目录及其子目录的方法&#xff0c;它返回一个生成器&#xff0c;生成一个三元组 (root, dirs, fil…

Instruction-Tuningpromote tuning原理,对比区别

Instruction-Tuning 原理 Instruction-Tuning&#xff08;指令调优&#xff09;是一种通过对模型提供明确指令或任务描述&#xff0c;从而提升其在特定任务上的表现的技术。这种方法通过预先定义好的任务说明&#xff08;instructions&#xff09;对模型进行微调&#xff0c;使…

鸿蒙应用开发之OpenGL应用和X组件9

接着下来,我们来分析函数CreateProgram的实现,它是实现着色器程序的编译、加载和删除资源。 GLuint EGLCore::CreateProgram(const char *vertexShader, const char *fragShader) { if ((nullptr == vertexShader) || (nullptr == fragShader)) { OH_LOG_Print(L…

MySQL—函数—函数小结

一、引言 前面博客我们已经学完了MySQL的函数&#xff0c;下面快速的对MySQL的函数做一个小结。 在讲解了MySQL的函数的时候&#xff0c;主要有四个方面&#xff1a; 1、字符串函数 &#xff08;1&#xff09;CONCAT&#xff1a;字符串连接 &#xff08;2&#xff09;LOWER、…

Java 多线程创建:三种主要方法

多线程编程是Java中一个重要的技术点&#xff0c;它允许程序并行执行多个任务&#xff0c;从而提高程序的执行效率。本文将详细介绍在Java中创建多线程的三种主要方法&#xff1a;继承Thread类、实现Runnable接口以及使用Callable和Future接口。 1. 继承 Thread 类 继承Threa…

【前端每日基础】day34——HTTP和HTTPS

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是互联网通信协议&#xff0c;用于在Web浏览器和Web服务器之间传输数据。以下是对HTTP和HTTPS的详细介绍&#xff1a; HTTP&#xff08;Hypertext…

Ubuntu server 24 (Linux) IPtables 双网卡 共享上网NAT 安装配置DHCP

一 开启路由转发功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安装DHCP #更新软件包列表&#xff1a; sudo apt update #安装DHCP服务器 sudo apt install isc-dhcp-server #修改监听网卡,根据实际修改 sudo vi /etc/default/isc-dhcp-server …

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…