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

2024-06-03 10:04

本文主要是介绍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,那么可以看看松哥最近录制的这套全新的视频教程。

这篇关于JWT 签名用对称加密还是非对称加密?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026677

相关文章

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

加减密签名

签名,验签的理解(转)图片理解数字签名和验签过程

如何实现加密功能

文章目录 1. 概念介绍2. 方法与功能2.1 基本用法2.2 加密算法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 加密主要是为了保护一些重要数据,我们在实际项目中会用到加密工具,因此在本章回中介绍一个加密工具

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使