JWT令牌技术
文章目录
- 什么是令牌技术
- 为什么需要令牌技术呢
- JWT 令牌
- JWT 组成
- JWT 令牌的使用
- 1. 引入 JWT 依赖
- 生成 JWT 令牌
- 解析 JWT 令牌
什么是令牌技术
令牌技术是一种重要的安全技术,它在多个领域中发挥着关键作用。简单来说,令牌(Token)可以被视为系统的临时密钥,相当于账户名和密码,用于决定是否允许特定的请求,并判断该请求来自哪个用户。
在网络安全领域,令牌技术被广泛应用。它允许用户在不提供密码或其他凭证的前提下,访问网络和系统资源。这些令牌在系统中持续存在,直到系统重新启动。令牌的一个显著特点是其随机性和不可预测性,这使得黑客或恶意软件很难猜测出令牌的内容。
在支付领域,令牌技术则表现为一种虚拟账号技术。它将用户持有的信用卡或借记卡的16位主账号转化为一个与之对应的虚拟账号,并与具体的设备(如智能手机)绑定。如果发生黑客入侵事件,用户的真实卡号已经被令牌技术转化为虚拟账号,即使黑客获取了这个电子令牌,也无法直接利用。此外,如果用户的设备丢失,金融机构可以简单地使该设备上的电子令牌失效,从而保护用户的账户安全。
以苹果支付为例,它正是应用了令牌技术。这种技术不仅提高了支付的安全性,还大大节约了成本,因为金融机构无需在每次安全风险事件发生后都发放新的实体卡。
此外,OTP(一次性密码)令牌也是一种令牌技术的体现。它采用一种算法,每隔一段时间(如60秒)生成一个不可预测的随机数字组合,作为一次性的登录密码。这种技术增强了账号的安全性,因为它避免了定期更换密码的繁琐,同时也减少了密码被猜测或破解的风险。
简单点来说:令牌技术就是一个用户身份的标识,名称起的很高大上,其实本质上就是一个字符串。
为什么需要令牌技术呢
给大家举个例子,对于一个用户量很大的软件来说,它的服务器的数量肯定不止一个,因为如果只有一个服务器的话,对于多个客户端发来的请求,一个服务器短时间内是无法及时处理这些请求的话,如果在短时间内客户端的请求数量达到了服务器能处理的最大数量的请求的话,那么这个服务器就可能会发生宕机的问题,那么所有客户端的请求就无法得到处理,出现这样的问题就会造成很大的损失。
所以为了避免出现单个服务器出现宕机的问题,一个应用的背后会有多个服务器,并且通过负载均衡的做法来将不同数量的请求分配给指定的服务器,如果一个服务器当时可以接收的请求量较大的话,通过负载均衡的做法该服务器就可以得到较多数量的在承受范围之内的请求数量,对应的,对于那些当时可以接收的请求数量较少的服务器来说,通过负载均衡的操作该服务器得到的请求的数量就较少,这样就极大的降低了服务器出现宕机的问题。
但是通过负载均衡的做法的话,又会出现其他的问题,对于网站上用户的操作,往往需要先对用户的登录状态进行判断,对于一些操作只有用户登录之后才可以进行,而通常的判断用户是否登陆的的方法就是通过是否存在 Session 会话来判断,当用户成功登录之后呢,就创建出类似哈希表的结构将 Session 存储在服务器本地,然后通过响应将 SessionId 返回给客户端,并且存储在 Cookie 中,下一次客户端发送请求之后,就会将这个 SessionId 发送给服务器,服务器拿到请求的数据包之后,就可以根据这个 SessionId 来判断用户是否登录了。但是既然 Session 会话是存储在服务器本地,那么当有多个服务器的时候,如果用户前两分钟发送的登录请求是在服务器 A 中处理的话,那么当前会话就是在服务器 A 的本地存储的,那么如果过了两分钟之后用户又发送了其他操作请求的话,这时因为负载均衡的操作,该请求被分配到服务器 B 中去处理的话,服务器 B 就会先判断用户是否登录,根据客户端发来的请求中的 SessionId 来获取会话,但是因为服务器 B 中没有存储对应的会话,所以就会强制用户进行登录,这时用户就会问了:我不是刚刚登录了吗?为什么又让我登录呢?这是哪个xx写的程序。这样就会极大的影响用户的使用体验。
所以为了解决这个问题就出现了令牌技术,令牌技术会将令牌存储在客户端的浏览器上,而不是服务器上,当客户端发送请求的时候,将这个令牌也发送给服务器,服务器得到这个令牌之后就会对这个令牌进行解析,如果解析成功就可以认定该用户处于登录状态,反之则强制用户进行登录。
给大家举个例子:在之前网络还不发达的时候,如果我们需要住酒店的时候,我们进去酒店的时候需要将身份证交给负责人员,但是当我们进行其他也需要身份证的操作的时候,因为我们的身份证在酒店负责人那里,所以我们就需要先去酒店负责人那里拿身份证然后才能继续,但是现在,我们的身份信息都被录入了公安系统,我们需要住酒店,只需要刷身份证之后,身份证就会归还给我们了,那么我们就可以去干其他的事了,这也就是能证明自己身份的信息在用户手中的好处。
JWT 令牌
实现令牌技术的方法有很多种,今天我为大家分享的令牌技术是 JWT 令牌技术(Json Web Token),JWT官网
JWT 组成
JWT 由三个部分组成,每部分中间使用点 . 分隔:
- Header(头部):头部包括令牌的类型(既JWT)及使用的哈希算法
- Payload(负载):负载部分是存放有效信息的方法,里面是一些自定义的内容。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容
- Signature(签名):此部分用于防止JWT内容被篡改,确保安全性
注意了签名是为了防止被篡改,而不是为了防止被解析,JWT之所以安全就是因为最后的签名。JWT令牌当前任何一个字符被篡改,整个令牌都会校验失败,就好比我们的身份证,它的目的不是为了不让别人知道,而是保证了我们的身份信息不会被篡改,人们很容易看到我们身份证上的信息,JWT也是。
当我们修改 Token 之后,再对其进行解析的时候,就会发现:该 Token 无法解析:
JWT 令牌的使用
1. 引入 JWT 依赖
首先因为 JWT 令牌属于第三方库,所以需要先引入 JWT 依赖:
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --><version>0.11.5</version><scope>runtime</scope>
</dependency>
生成 JWT 令牌
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@SpringBootTest
public class JwtUtilTest {//设置令牌的过期时间为30分钟private static final long expiration = 1000 * 60 * 30;//密钥private static final String secretString = "fahfjkshfshdjfhskhfksjdhfjsdjfhsjkdfhs";//生成安全密钥private static final SecretKey KEY = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretString));@Testpublic static void genJwt() {//自定义信息Map<String, Object> claim = new HashMap<>();claim.put("id",1);claim.put("username","zhangsan");String jwt = Jwts.builder().setClaims(claim) //自定义内容(负载).setIssuedAt(new Date()) //设置签证时间.setExpiration(new Date(System.currentTimeMillis() + expiration)) //设置过期时间.signWith(KEY) //签名算法.compact();System.out.println(jwt);}public static void main(String[] args) {JwtUtilTest.genJwt();}
}
当我们运行这个方法之后,就会报下面这个错误,原因是,我们的密钥的长度太短了,并且 idea 建议我们使用 io.jsonwebtoken.security.Keys#secretKeyFor(SignatureAlgorithm)
方法来生成一个密钥:
java.lang.ExceptionInInitializerError
Caused by: io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 224 bits which is not secure enough for any JWT HMAC-SHA algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HMAC-SHA algorithms MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys#secretKeyFor(SignatureAlgorithm) method to create a key guaranteed to be secure enough for your preferred HMAC-SHA algorithm. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.at io.jsonwebtoken.security.Keys.hmacShaKeyFor(Keys.java:96)at JwtUtilTest.<clinit>(JwtUtilTest.java:19)
Exception in thread "main"
所以我们就先使用 idea 建议的方法来生成一个密钥:
public static void genKey() {Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);String secretString = Encoders.BASE64.encode(key.getEncoded());System.out.println(secretString);
}
HS256 代指对应的编码方式:
我们运行这个方法获得一个符合规范的密钥:
private static final String secretString = "ZzvPBGOUCmilHmOl6jNmAbusvQryFipKn4VA1yrP7e0=";
base64编码之后的字符串应该只包含 A-Z, a-z, 0-9, ‘-’ 和 ‘_’ 这些字符。
根据生成的密钥生成 Token:
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImlhdCI6MTcxMDA3NjI0OSwiZXhwIjoxNzEwMDc4MDQ5fQ.PzZoPdXaL2Guc3IZDt2m_-bmaIwu9GzgivTwus36Qno
解析 JWT 令牌
当我们使用相应的 API 生成 JWT 之后,客户端浏览器将服务器生成的令牌保存在浏览器中,下次发送请求的时候就将令牌传给服务器,服务器得到之后就需要对这个令牌进行解析。
我们将前面生成的 JWT 放在 JWT 解码网站上进行解析之后就可以得到我们的载荷部分,exp表示过期时间:
但是可以看到密钥部分是无法解析出来的,别人拿不到对应的密钥就无法伪造出 Token。
然后我们看看如何对 Token 进行解析:
public static void parseJwt() {String token = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImlhdCI6MTcxMDA3OTExMSwiZXhwIjoxNzEwMDgwOTExfQ.0_hCtlyhAPoQYnbyCvcKGDGS78YS6jxjNfrFtJ--E9M";Claims claims = Jwts.parserBuilder().setSigningKey(secretString).build().parseClaimsJws(token).getBody();System.out.println(claims);
}
令牌解析之后我们就可以看到里面的内容,如果在解析过程中没有出现报错,就说明解析成功了。
解析失败则会出现下面的报错:
通过 JWT 令牌技术就可以实现我们生活中的登录功能了。
相关文章:

JWT令牌技术
文章目录 什么是令牌技术为什么需要令牌技术呢JWT 令牌JWT 组成JWT 令牌的使用1. 引入 JWT 依赖生成 JWT 令牌解析 JWT 令牌 什么是令牌技术 令牌技术是一种重要的安全技术,它在多个领域中发挥着关键作用。简单来说,令牌(Token)可…...

从零学习Linux操作系统 第三十二部分 ansible中剧本的应用
一、什么是playbook及playbook的组成 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 play就是一个个模块用列表的方式体现出来 playbook的语法是用YAML的预防进行书写的 2.YAML 简介 是一种表达资料序列的格式,类似XM…...

目标网站屏蔽右键检查(使用开发者工具)
问题: 通过网络触手中想要获取某网站的数据出现:鼠标右击,或按ctrl F10 键 无反应(也就是打不开类似谷歌的开发工具) 问题同等与: 解决网页屏蔽F12或右键打开审查元素 引用: 作者ÿ…...

docker安装ES、LogStash、Kibana
文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装LogStash三、安装kibana四、SpringBoot集成LogStash,将日志输出到ES中五、 启动项目,监控项目运行 提示:以下是本篇…...
解决对接淘宝开放平台添加商品图片问题
问题 之前工作因队友离开,只一天接手其部分且第二天就要上线此工具产品,测试提了一些Bug,在Bug中有一个是添加商品图片。前端告知不能用、电话离职队友说能用。没办法自己上、追踪代码。 en这块代码跟需求好像不太相符,重写。 …...

总结:Spring创建Bean循环依赖问题与@Lazy注解使用详解
总结:Spring创建Bean循环依赖问题与Lazy注解使用详解 一前提知识储备:1.Spring Bean生命周期机制(IOC)2.Spring依赖注入机制(DI)(1)Autowired注解标注属性set方法注入(2&…...
Mac下java环境搭建
JDK 教程:MAC安装JDK及环境变量配置-CSDN博客 建议JDK7和JDK8都装上,因为一些老项目是用JDK7开发,使用JDK8编译时报错。(若没有老项目,直接安装jdk8) 若配置环境变量时找不到JDK的安装路径,有两种方式: 方式一、mac默认位置为:/Library/Java/JavaVirtualMachines/…...
mac设置java环境变量
在 macOS 系统上,设置 JAVA_HOME 环境变量可以通过以下步骤进行: 打开终端应用程序。 输入以下命令来查找 Java 的安装路径:/usr/libexec/java_home 终端会返回 Java 的安装路径,类似 /Library/Java/JavaVirtualMachines/jdk1.…...

【笔记】Android 漫游定制SPN定制有关字段
一、SPN模块简介 【笔记】SPN和PLMN 运营商网络名称显示 Android U 配置 WiFiCalling 场景下PLMN/SPN 显示的代码逻辑介绍 【笔记】Android Telephony 漫游SPN显示定制(Roaming Alpha Tag) 二、相关配置字段 non_roaming_operator_string_array 是否…...

【MATLAB第99期】#源码分享 | 基于MATLAB的SHEPard模型多输入单输出回归预测模型
【MATLAB第99期】#源码分享 | 基于MATLAB的SHEPard模型多输入单输出回归预测模型 Shepard模型(简称SP模型)就是一种直观的、可操作的相似预测法,常用于插值。相似预测法基本原理按照相似原因产生相似结果的原则,从历史样本中集中找出与现在的最相似的一…...

python工具方法 47 基于paddleseg将目标检测数据升级为语义分割数据
在进行项目研究时,通常需要搜集开源数据集。但是所能搜集到的数据集通常会存在形式上的差异,比如我想要的是语义分割数据,而搜集到的数据集却是目标检测数据;在这种情况下所搜集的数据就完成没有利用价值了么?不,其还存在价值,我们可以通过模型训练对数据标签的标注粒度…...
OpenJudge - 38:计算多项式的导函数
总时间限制: 1000ms 内存限制: 65536kB 描述 计算多项式的导函数是一件非常容易的任务。给定一个函数f(x),我们用f(x)来表示其导函数。我们用x^n来表示x的n次幂。为了计算多项式的导函数,你必须知道三条规则: (1)、(C) 0 如果C是常量 (2)、…...
数据结构:顺序表(C++实现)
1 头文件 SeqList.h //SeqList.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cassert> using namespace std; class SeqList { public://初始化SeqList();//销毁~SeqList();//头插void PushFront(int data);//头删void PopFront(…...
从零开始 TensorRT(7)C++ 篇:解析 ONNX
前言 学习资料: B站视频配套代码 cookbook 示例 参考源码:cookbook → 04-BuildEngineByONNXParser → pyTorch-ONNX-TensorRT 源码 C 代码量较多,已上传 GitHub OpenCV 安装: apt install libopencv-dev(1&…...
k8s集群的CA证书过期处理
文章目录 制作延期的CA证书获取CA全名准备签发申请配置生成新CA验证并替换CA 更新master组件的CA配置kube-apiserverkube-controller-managerkube-schedulerkube-admin检查证书过期时间 更新ServiceAccount secret更新node组件配置的CA更新kubelet连接配置签发kubelet自动申请的…...

linuxOPS基础_linux系统注意事项
Linux严格区分大小写 Linux 和Windows不同,Linux严格区分大小写的,包括文件名和目录名、命令、命令选项、配置文件设置选项等。 例如,Win7 系统桌面上有文件夹叫做Test,当我们在桌面上再新建一个名为 test 的文件夹时,…...

《探索虚拟与现实的边界:VR与AR谁更能引领未来?》
引言 在当今数字时代,虚拟现实(VR)和增强现实(AR)技术正以惊人的速度发展,并逐渐渗透到我们的日常生活中。它们正在重新定义人与技术、人与环境之间的关系,同时也为各行各业带来了全新的可能性。然而,究竟是VR还是AR更有潜力改变未来?本文将围绕这一问题展开深入探讨。…...
C++ 获取上一级文件夹路径
我们可能会经常遇到文件所在文件夹路径的问题,虽然各大平台也有提供方便快捷的API来实现,但是如果脱离平台本身,或者想实现跨平台的话,可以考虑用纯C的代码来实现这一需求 示例代码 #include <string> #include <ios…...
Apache Pulsar的分布式集群模式构建
1. 准备环境 6台带jdk8的Linux服务器(CentOS7为例) ip分别为: 主机名IP地址zookeeper1192.168.8.101zookeeper2192.168.8.102zookeeper3192.168.8.103pulsar1192.168.8.108pulsar2192.168.8.109pulsar3192.168.8.110 2. 下载Pulsar最新安…...

第三百八十六回
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容固定显示…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...