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 令牌技术就可以实现我们生活中的登录功能了。
在这里插入图片描述

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

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

相关文章

大数据冷热分离方案

数据冷热分离方案 1、背景 ​ 随着业务的发展&#xff0c;在线表中的数据会逐渐增加。常规业务都有冷热数据现象明显的特性&#xff08;需要访问的都是近期产生的热数据&#xff1b;时间久远的冷数据出于备份、备案溯源等诉求会进行在线保留&#xff09;。在业务表数据 量可控…

深入理解Java的Writer类

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

Android Studio 检测不到 IDE 更新

点击 Configure updates...&#xff0c;不知道什么时候把 Check for IDE updates 去勾了&#xff0c;一年没有检测到更新&#xff01; 只能重新安装&#xff0c;掉坑里了&#xff01;

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

linuxOPS基础_linux系统注意事项

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

Xilinx 7系列FPGA配置(ug470)

Xilinx 7系列FPGA配置&#xff08;ug470&#xff09; 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链&#xff08;非同时配置&#xff09;串行配置&#xff08;同时配置&#xff09;时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…

深入解读 Elasticsearch 磁盘水位设置

本文将带你通过查看 Elasticsearch 源码来了解磁盘使用阈值在达到每个阶段的处理情况。 跳转文章末尾获取答案 环境 本文使用 Macos 系统测试&#xff0c;512M 的磁盘&#xff0c;目前剩余空间还有 60G 左右&#xff0c;所以按照 Elasticsearch 的设定&#xff0c;ES 中分片应…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

ABAP接口-RFC连接(ABAP TO ABAP)

目录 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09;创建ABAP连接RFC函数的调用 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09; 创建ABAP连接 事务代码&#xff1a;SM59 点击创建&#xff0c;填写目标名称&#xff0c;选择连接类型&#xff1a; 填写主机名…

异步编程实战:使用C#实现FTP文件下载及超时控制

博客标题: 异步编程实战&#xff1a;使用C#实现FTP文件下载及超时控制 如果你的函数不是async&#xff0c;你仍然可以实现相同的超时功能&#xff0c;但你将不得不依赖更多的同步代码或使用.Result或.GetAwaiter().GetResult()来阻塞等待任务完成&#xff0c;这可能导致死锁的风…

HarmonyOS(二)Ability应用模型概述

目录 1 Ability概念 2 Ability形态 3 Stage优势 4 Stage模型结构 5 总结 注&#xff1a;本章内容提前声明。 基于HarmonyOS开发者3.1/4.0版本配套的开发者文档&#xff0c;对应API能力级别为API 9 Release。 详情可参考官网API入门第一章应用模型文档中心 1 Ability概念…

苍穹外卖学习-----2024/03/09

1.菜品分页查询 代码在这里 分页查询菜品 2.删除菜品 [链接]param 1、概览 本文将带你了解 Spring 中 RequestParam 注解的用法。 简单地说&#xff0c;可以使用 RequestParam 从请求中提取查询参数、表单参数甚至是多个参数。 2、示例端点 假设我们有一个端点 /api/foos&a…

KVM技术原理及安装KVM并且在KVM里面安装RHEL8

目录 一、kvm原理 1..1虚拟化概念 1.2 虚拟化产生背景 1.3虚拟化架构 1.4主流的虚拟化技术 1.5阐述个人对虚拟化技术的几种分类认知 二、安装KVM并且在KVM里面安装RHEL8 2.1在RHEL8主机上安装KVM 2.2安装完成后&#xff0c;使用virt-manager命令打开虚拟机管理图形界面…

Anaconda prompt运行打开jupyter notebook 指令出错解决方案

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

Android 14 设置锁屏为NONE后开启双卡PIN锁,重启设备后,输完卡1的PIN码就进入了安卓界面,未提示输入卡2的PIN码

一.问题背景 目前在多个Android14平台发现开启双卡PIN码并且关闭屏幕锁的情况下,第二个PIN码锁输入弹框不能弹出问题,导致第二个卡不能注网。 如下是未修改前重启后解锁卡1PIN码的状态 可以看出卡2不能正常使用 二.何处关闭了卡2的PIN锁? 1.添加日志 首先在KeyguardSecu…

美团 Java 开发笔试热经

Voiceover&#xff1a; 见者有缘&#xff0c;缘来好运。欢迎大家来到我的博客【CS_GUIDER】&#xff1a;&#xff08;建议收藏至浏览器书签&#xff09; https://wlei224.gitee.io &#xff08;建议访问这个&#xff0c;速度极快&#xff09; https://wl2o2o.github.io &#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RotationGesture)

用于触发旋转手势事件&#xff0c;触发旋转手势的最少手指为2指&#xff0c;最大为5指&#xff0c;最小改变度数为1度。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 RotationGesture(value?: …

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中&#xff0c;需要对接三方websocket协议数据或者连接并存储线上websocket协议数据&#xff0c;需要使用websocket客户端 连接线上的websocket服务端获取并存储数据&#xff0c;然后将数据存储成文件格式可移植&#xff0c;并将数据复制 到本地&#xff0c;…