Jwt加解密

概述

记录jwt加解密的demo。
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传输信息。JWT 通常用于身份验证和信息交换,因为它可以被签名和加密,确保数据的完整性和隐私性。

JWT 的基本结构

JWT 由三部分组成,每部分之间用点号(.)分隔:

  1. Header(头部)
  2. Payload(载荷)
  3. Signature(签名)

1. Header(头部)

头部通常包含两部分信息:令牌的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。

示例:

{"alg": "HS256","typ": "JWT"
}

2. Payload(载荷)

载荷部分包含声明(claims),声明是用来传递信息的键值对。JWT 规范定义了几种标准的声明,但你也可以自定义声明。

常见的标准声明包括:

  • iss (Issuer):签发者
  • sub (Subject):主题
  • aud (Audience):受众
  • exp (Expiration Time):过期时间
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):唯一标识符

示例:

{"sub": "1234567890","name": "John Doe","admin": true,"userInfo": {"email": "john.doe@example.com","roles": ["user", "admin"]},"iat": 1516239022
}

3. Signature(签名)

签名部分用于验证消息在传输过程中没有被篡改,并且可以验证 JWT 的接收方是否信任 JWT 的签发方。签名是通过对头部和载荷进行 Base64Url 编码,然后用指定的算法(如 HMAC SHA256)进行签名生成的。

签名生成步骤:

  1. 将头部和载荷分别进行 Base64Url 编码。
  2. 将编码后的头部和载荷用点号(.)连接起来。
  3. 使用指定的算法和密钥对连接后的字符串进行签名。

示例:

String encodedHeader = Base64Url.encode(headerJson);
String encodedPayload = Base64Url.encode(payloadJson);
String unsignedToken = encodedHeader + "." + encodedPayload;
String signature = sign(unsignedToken, secretKey);
String jwt = unsignedToken + "." + signature;

JWT 的优点

  1. 无状态:JWT 是无状态的,服务器不需要保存会话信息,可以轻松地扩展到多服务器架构。
  2. 安全性:JWT 可以被签名,确保数据的完整性;还可以被加密,确保数据的隐私性。
  3. 自包含:JWT 包含了所有的必要信息,可以在一个紧凑的字符串中传递。
  4. 跨域支持:JWT 可以在不同的域名之间传递,适用于单点登录(SSO)等场景。

JWT 的使用场景

  1. 身份验证:用户登录后,服务器生成一个 JWT 并返回给客户端。客户端在后续请求中携带 JWT,服务器验证 JWT 的有效性。
  2. 信息交换:在不同系统之间传递信息,确保信息的完整性和安全性。
  3. 授权:根据 JWT 中的声明信息,决定用户是否有权限访问特定资源。

引入依赖

      <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

代码示例1

创建 JWT

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY = "your-secret-key-must-be-at-least-512-bits-long"; // 确保密钥足够长public static String createToken(Map<String, Object> claims, long expiration) {Key signingKey = new SecretKeySpec(SECRET_KEY.getBytes("UTF-8"), SignatureAlgorithm.HS512.getJcaName());return Jwts.builder().setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + expiration)).signWith(SignatureAlgorithm.HS512, signingKey).compact();}
}

解析 JWT

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Map;public class JwtUtil {private static final String SECRET_KEY = "your-secret-key-must-be-at-least-512-bits-long"; // 确保密钥足够长public static Map<String, Object> parseToken(String token) {Key signingKey = new SecretKeySpec(SECRET_KEY.getBytes("UTF-8"), SignatureAlgorithm.HS512.getJcaName());Claims claims = Jwts.parser().setSigningKey(signingKey).parseClaimsJws(token).getBody();return (Map<String, Object>) claims.get("userInfo");}
}

代码示例2

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class UserInfo解析 {private static final String TOKEN_PREFIX = "Basic ";private static final String BASIC_TOKEN_KEY = "123456789poiuytrewqzxcvbnmlkjhgfdsa";/*** Token缺省过期时间是30分钟*/private static final Long TOKEN_EXPIRATION = 1800000L;private static final String CLAIM_KEY_CREATEDTIME = "CreatedTime";private static final String USER_INFO_STRING = "userInfo";public static void main(String[] args) {Map<String, Object> map = new HashMap<>();Map<String, Object> userInfoMap = new HashMap<>();map.put("userInfo", userInfoMap);userInfoMap.put("name", "张三");userInfoMap.put("age", "26");userInfoMap.put("address", "河北石家庄");String token = encryptToken(map);Map<String, Object> userInfo = decryptToken(token);log.info(userInfo.toString());}public static Map<String, Object> decryptToken(String token){String jetToken = token.substring(TOKEN_PREFIX.length());Key signingKey = new SecretKeySpec(BASIC_TOKEN_KEY.getBytes(), SignatureAlgorithm.HS512.getJcaName());Claims claims = Jwts.parser().setSigningKey(signingKey).parseClaimsJws(jetToken).getBody();return claims.get(USER_INFO_STRING, Map.class);}public static String encryptToken(Map<String, Object> map){long createTime = System.currentTimeMillis();map.put(CLAIM_KEY_CREATEDTIME, createTime);String token = Jwts.builder().setClaims(map).setExpiration(new Date(createTime + TOKEN_EXPIRATION)).signWith(SignatureAlgorithm.HS512, BASIC_TOKEN_KEY.getBytes()).compact();return TOKEN_PREFIX + token;}}

执行结果
在这里插入图片描述

注意事项

  1. 密钥管理:确保密钥的安全性,不要泄露。
  2. 过期时间:合理设置过期时间,防止 JWT 被长期滥用。
  3. 签名算法:选择合适的签名算法,确保安全性。
  4. 敏感信息:不要在 JWT 中存储敏感信息,如密码。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸥柏(OBOO)户外触摸广告屏科技创新 高速服务区收费站案例

鸥柏&#xff0c;作为户外液晶显示技术的品牌高端领先者&#xff0c;其新产品鸥柏户外触摸屏在高速服务区收费站入口处得到了真实且广泛的应用。OBOO鸥柏户外广告机能够存储和展示海量信息&#xff0c;包括新闻、政策、天气预报、实时路况等&#xff0c;为过往司乘人员提供丰富…

ASED6015SH-ASEMI中低压MOS管ASED6015SH

ASED6015SH-ASEMI中低压MOS管ASED6015SH 型号&#xff1a;ASED6015SH 品牌&#xff1a;ASEMI 导通内阻&#xff1a;90mΩ 启动电压&#xff1a;2V-4V 最大漏源电流&#xff08;Id&#xff09;&#xff1a;19A 漏源击穿电压&#xff08;VRM&#xff09;&#xff1a;150V …

`掌握Python-PPTX,让PPt制作变得轻而易举!`

文章目录 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01;背景介绍python-pptx 是什么&#xff1f;如何安装 python-pptx&#xff1f;简单库函数使用方法应用场景常见Bug及解决方案总结 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01; 背景介绍…

linux的用户账号与权限管理

一、用户账号 root 和zhang 表示当前的登录用户test1 表示当前的主机名/home&#xff1a; 表示当前所在的目录为/home~&#xff1a; 表示当前所在的目录为~#&#xff1a; 表示当前用户是管理员$&#xff1a; 表示当前用户是普通用户 1.切换用户 su - 用户名 &#xff08;完全切…

Qt项目实战:银行利息(贷款)计算器

目录 一.ui设计 二.初始化表单 三. 存款计算 四.贷款计算 五.效果 六.代码 1.h 2.cpp 一.ui设计 二.初始化表单 获取当前时间&#xff0c;并将开始日期设置为当前日期&#xff0c;将结束日期设置为当前日期加一年 三. 存款计算 1.从文本框获取当前资金、利率、定期期…

无人机高山景区物资吊运技术及前景分析

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到各个领域&#xff0c;并在其中展现出巨大的潜力和应用前景。在高山景区物资运输方面&#xff0c;无人机技术的引入不仅解决了传统运输方式中人力成本高、效率低下的问题&#xff0c;还极大地提升了运输的安全性和灵活性…

就是这个样的粗爆,手搓一个计算器:数线计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"><div class"input-group"><label for"a">…

NSET or MSET算法--原理解析

1.背景 NSET/MSET是一种非线性的多元预测诊断技术&#xff0c;广泛应用于系统状态估计、故障诊断和预测等领域&#xff1b;相比于传统的线性模型和方法&#xff0c;NSET/MSET能够更好地处理非线性系统&#xff0c;并提供更准确的预测和诊断能力。在早期&#xff0c;MSET融合了…

NAS端最强音乐库,多平台服务支持。海康存储部署『Navidrome』

NAS端最强音乐库&#xff0c;多平台服务支持。海康存储部署『Navidrome』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS用户&#xff0c;我们总是喜欢将自己喜欢的音乐资源通过下载的方式保存在本地&#xff0c;不过海康存储目前对因音乐的支持和管理实在过于薄弱&am…

Vue2+3

Day1 创建Vue实例 准备容器 引包 —— 开发版本 创建Vue实例 —— new Vue() 指定配置项 el 和 data > 渲染数据 el指定挂载点&#xff0c;指定控制的是哪个盒子 data提供数据 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

AWTK-HarmonyOS NEXT 发布

AWTK 全称为 Toolkit AnyWhere&#xff0c;是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎&#xff0c;支持跨平台同步开发&#xff0c;一次编程&#xff0c;到处编译&#xff0c;跨平台使…

新闻稿件管理:SpringBoot框架实战指南

3系统分析 3.1可行性分析 通过对本新闻稿件管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻稿件管理系统采用SSM框架&#xff0c;JAVA作为开发语…

太炸裂了,Ollama跑本地模型已成为历史,现在都在使用这个工具,而且还能集成本地知识库

AI的发展速度真是超出我们的想象&#xff0c;遥想几个月前&#xff0c;我还在使用Ollama跑本地大模型&#xff0c;最近有另一款可以跑本地大模型的工具迅速崛起&#xff0c;在GitHub上已有70.3K Stars&#xff0c;相信不久就会超越Ollama&#xff0c;除了可以本地运行大模型之外…

在Vue和OpenLayers中使用移动传感器实现飞机航线飞行模拟

项目实现的核心代码 项目概述 该项目的目标是使用Vue.js作为前端框架&#xff0c;结合OpenLayers用于地图显示&#xff0c;实时获取来自手机传感器的数据&#xff08;如经纬度、高度、速度&#xff09;来模拟飞机在地图上的飞行轨迹。整体架构如下&#xff1a; Vue.js 用于构建…

Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)

文章目录 前言解决方法后记 前言 一个排阻接八个 LED&#xff0c;方便又省事&#xff0c;但出现了P1端口输出低电平后&#xff0c;仿真引脚却一直显示红色保持高电平不变&#xff0c;用电压表测量显示 2V 左右。 这是仿真的问题&#xff0c;在用开发板时是不会遇到的&#xff…

神经网络进行波士顿房价预测

前言 前一阵学校有五一数模节校赛&#xff0c;和朋友一起参加做B题&#xff0c;波士顿房价预测&#xff0c;算是第一次自己动手实现一个简单的小网络吧&#xff0c;虽然很简单&#xff0c;但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …

一分钟讲透聚合SDK的工作原理

聚合 SDK 广告是指通过整合多个广告 SDK&#xff08;软件开发工具包&#xff09;&#xff0c;将来自不同广告平台和渠道的广告资源集中管理和调配&#xff0c;并在应用或平台中展示和投放的一种广告模式。 使用聚合 SDK 可以让开发者或广告运营者更方便地接入多种广告源&#…

Visual Studio | 配置管理

文章目录 一、配置管理1、项目属性1.1、常规1.2、VC 目录1.3、C/C -> 常规1.4、C/C -> 预处理器1.5、C/C -> 预编译头1.6、连接器 -> 常规1.7、连接器 -> 输入 2、编辑2.1、显示空格或tab符 一、配置管理 1、项目属性 1.1、常规 字段功能目标平台版本用于生成…

yolov8涨点系列之增加检测头

文章目录 检测头对于目标检测的作用特征转换与信息提取多尺度目标适应预测与定位损失计算与模型优化 YOLOv8的检测头介绍结构组成特征提取层上采样层特征融合层检测层 工作原理锚点机制优化策略自适应空间特征融合&#xff08;ASFF&#xff09;焦点损失&#xff08;Focal Loss&…

django-tidb版本说明

django-tidb 版本说明 https://github.com/pingcap/django-tidb django-python版本说明 Django 4.2 版本发行说明 | Django 文档 | Django