第40天:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR

时间轴:

演示案例:

SpringBoot-身份鉴权-JWT 技术

SpringBoot-打包部署-JAR&WAR

SpringBoot-身份鉴权-JWT 技术

SpringBoot- 身份鉴权 -JWT 技术
JWT(JSON Web Token) 是由服务端用加密算法对信息签名来保证其完整性和不可伪
造;
Token 里可以包含所有必要信息,这样服务端就无需保存任何关于用户或会话的信息;
JWT 用于身份认证、会话维持等。由三部分组成, header payload signature
参考: https://cloud.tencent.com/developer/article/2101634

 jwt,cookie,session的详解:

Cookie、Session、JWT的详解_cookie session jwt-CSDN博客

Header、Payload 和 Signature 是 JSON Web Token(JWT)的三个主要组成部分。

Header(头部): JWT 的头部通常包含两部分信息:声明类型(typ)和使用的签名算法(alg)。这些信息以 JSON 格式存在,然后进行 Base64 编码,形成 JWT 的第一个部分。头部用于描述关于该 JWT 的元数据信息。

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

Payload(负载): JWT 的负载包含有关 JWT 主题(subject)及其它声明的信息。与头部一样,负载也是以 JSON 格式存在,然后进行 Base64 编码,形成 JWT 的第二个部分。
                        

{"sub": "1234567890","name": "John Doe","iat": 1516239022
}

Signature(签名): JWT 的签名是由头部、负载以及一个密钥生成的,用于验证 JWT 的真实性和完整性。签名是由指定的签名算法对经过 Base64 编码的头部和负载组合而成的字符串进行签名生成的。

例如,使用 HMAC SHaA-256 算法生成签名:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret
)

最终,JWT 是由这三个部分组成的字符串,形如 **header.payload.signature**。JWT 通常用于在网络上安全地传输信息,例如在身份验证过程中传递令牌。

案例1:

1.创建TestJwt:

2.勾选web组件:

3.放入依赖项:

<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>

4.创建文件JwtController:
4.1创建 JWT
JWT.create()
4.2配置 JWT
JWT.create()
//header
.withHeader(map)
//payload
.withClaim("userid",id)
.withClaim("username",user)
.withClaim("password",pass)
//signature
.sign(Algorithm.HMAC256("xiaodisec"));
package cn.xiaodou.testjwt.demos.web;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class JwtController {//模拟用户的jwt身份创建 数据的jwt加密@PostMapping("/jwtcreate")@ResponseBodypublic static void main(String[] args) {String jwttoken = JWT.create()//设置创建的header部分//.withHeader()//设置创建的payload部分.withClaim("userid", 1).withClaim("username", "admin").withClaim("password", "123456")//设置时效(JWT过期时间)//.withExpiresAt()//创建设置的signature部分 算法和密匙.sign(Algorithm.HMAC256("xiaodisec"));System.out.println(jwttoken);}
}

 测试过程:

若有报错:

java jdk版本过低或者jwt的版本过高导致了不匹配

可以jdk提高到11来进行处理,或者将jwt版本降下来。

jwt分析:

 可以进行jwt解密:

JSON Web Tokens - jwt.io

虽然能解密出来。但是你不知道他加密的密钥。从而也无法登录。

5.对jwt进行服务器验证:
4 、解析 JWT
// 构建解密注册
JWTVerifier jwt =
JWT.require(Algorithm.HMAC256("xiaodisec")).build();
// 解密注册数据
DecodedJWT verify = jwt.verify(jwtdata);
// 提取解密数据
Integer userid = verify.getClaim("userid").asInt();
package cn.xiaodou.testjwt.demos.web;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Controller;@Controller
public class JwtController {//模拟用户的jwt身份创建 数据的jwt加密public static void main(String[] args) {String jwttoken = JWT.create()//设置创建的header部分//.withHeader()//设置创建的payload部分.withClaim("userid", 1).withClaim("username", "admin").withClaim("password","123456")//设置时效(JWT过期时间)//.withExpiresAt()//创建设置的signature部分 算法和密匙.sign(Algorithm.HMAC256("xiaodisec"));System.out.println(jwttoken);jwtcheck(jwttoken);}//模拟JWT身份的检测 jwt数据解密public static void jwtcheck(String jwtdata) {//String jwtdata="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk";//构建解密注册JWTVerifier jwt = JWT.require(Algorithm.HMAC256("xiaodisec")).build();//解密注册数据DecodedJWT verify = jwt.verify(jwtdata);//提取注册解密数据 payload部分Integer userid = verify.getClaim("userid").asInt();String username = verify.getClaim("username").asString();String password = verify.getClaim("password").asString();System.out.println(userid + username + password);}
}
//        if(username.equals("admin")){
//            return "admin";
//        }else {
//            return "gay?";
//        }//提取header部分//verify.getHeader();//提取sign签名部分//verify.getSignature();

运行结果:

6、配置前端提交数据访问客户端页面

在resources→static→index.html创建如下的前端页面

<html>
<body>
<h1>hello word!!!</h1>
<p>this is a html page</p>
</body><form action="../jwtcreate" method="post">id:<input type="text" name="id"><br>user:<input type="text" name="user"><br>pass:<input type="text" name="pass"><br><input type="submit" value="create">
</form><form action="../jwtcheck" method="post">jwtdata:<input type="text" name="jwtdata"><br><input type="submit" value="check">
</form></html>

后端改成web界面:

package cn.xiaodou.testjwt.demos.web;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.sun.org.apache.xpath.internal.objects.XString;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class JwtController {@PostMapping("/jwtcreate")@ResponseBody//模拟用户的jwt身份创建 数据的jwt加密public static String main(Integer id,String user,String pass) {String jwttoken = JWT.create()//设置创建的header部分//.withHeader()//设置创建的payload部分.withClaim("userid", id).withClaim("username", user).withClaim("password",pass)//设置时效(JWT过期时间)//.withExpiresAt()//创建设置的signature部分 算法和密匙.sign(Algorithm.HMAC256("xiaodisec"));System.out.println(jwttoken);return jwttoken;}@PostMapping("/jwtcheck")@ResponseBody//模拟JWT身份的检测 jwt数据解密public static String jwtcheck(String jwtdata) {//String jwtdata="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk";//构建解密注册JWTVerifier jwt = JWT.require(Algorithm.HMAC256("xiaodisec")).build();//解密注册数据DecodedJWT verify = jwt.verify(jwtdata);//提取注册解密数据 payload部分Integer userid = verify.getClaim("userid").asInt();String username = verify.getClaim("username").asString();String password = verify.getClaim("password").asString();System.out.println(userid + username + password);if(username.equals("admin")){return "admin";}else {return "gay?";}}
}
//        if(username.equals("admin")){
//            return "admin";
//        }else {
//            return "gay?";
//        }//提取header部分//verify.getHeader();//提取sign签名部分//verify.getSignature();

访问页面进行测试:(输入admin,若解码与admin相同返回正常值,证明登录成功)

7、安全问题
参考: https://cloud.tencent.com/developer/article/2101634

1.如果使用jwt.io直接修改后访问会成功吗?

将admin改为xiaodi

将修改后得到的值放入刚才的页面进行解密:

会发现进行了报错处理。

若在此处加上signature,那就会成功:

总结:

SpringBoot-打包部署-JAR&WAR

参考: https://mp.weixin.qq.com/s/HyqVt7EMFcuKXfiejtfleg
SpringBoot 项目打包在 linux 服务器中运行 :
jar 类型项目
jar类型项目使用 SpringBoot打包插件打包时,会在打成的 jar中内置tomcat的jar。
所以使用 jdk直接运行jar即可,jar项目中功能将代码放到其内置的tomcat中运行。

如何进行项目打包呢?

第一种打包方式jar:

1.先点击maven旁白的clean(将运行产生的一些配置进行清空)

2.点击maven旁白的package进行打包。

或使用指令:

maven-clean-package

生成的文件会在此处:

报错解决:用idea生成jar包时没有original文件-CSDN博客
java -jar XXX.jar 没有主清单属性以及找不到或无法加载主类的问题-CSDN博客

运行时使用

java -jar TestJwt-0.0.1-SNAPSHOT.jar

若运行的时候进行报错:

通常报错是没有mainclass,或者下面的<skip>跳过了上面的mainclass

改成<skip>false</skip>或者直接删除掉。

正常情况下为:

java -jar TestJwt-0.0.1-SNAPSHOT.jar

(重复以上的操作)

第二种打包方式war:

在打包时需要将内置的tomcat插件排除,配置servlet的依赖和修改pom.xml,
然后将war文件放到tomcat安装目录webapps下,启动运行tomcat自动解析即可。

1.修改pom.xml:

**<packaging>war</packaging>**

2.启动类里面加入配置:

package cn.xiaodou.testjwt;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplication
public class TestJwtApplication extends SpringBootServletInitializer {public static void main(String[] args) {SpringApplication.run(TestJwtApplication.class, args);}@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(TestJwtApplication.class);}
}

3.使用clean,package进行打包。

遇到报错:

<fail0nMissingWebXml>false</fail0nMissingWebXml>

4、war放置tomcat的后E:\tomcat\apache-tomcat-9.0.74-windows-x64\apache-tomcat-9.0.74\webapps

双击使用tomcat中的bin/start up.bat启动

会发现在webapps中多了一个TestJwt-0.0.1-SNAPSHOT页面:

点击查看其路由路径进行访问:

尝试访问:

源码泄露问题:

访问jar文件,会发现全部都被加密了和原来我们看到的不一样。

从而推出了反编译技术将class转换为java。

 访问文件发现不能像以前一样下载源文件。
 如何进行反编译呢?

 将文件解压后,将路径地址放入

成功反编译出来:

上面显示的是反编译.class文件,字节码版本 52.0(Java8)。

但注释那些。

本文章有李豆豆喵和番薯小羊卷~共同完成。

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

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

相关文章

计算机毕业设计SpringBoot+Vue.js医院挂号就诊系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Linux之命令记录【一】

文章目录 前言几个重要的热键1.[Tab]按键2.[Ctrl]-c 按键3.[Ctrl]-d 按键4.[shift]{[PageUP]|[Page Down]}按键 线上求助&#xff08;查看帮助信息&#xff09;1. --help2.man page3.info page 用户身份1.su 基础指令1.date2.cal3.bc 系统字符集相关1.locale 文本编辑器1.nano …

Ollama存在安全风险的情况通报及解决方案

据清华大学网络空间测绘联合研究中心分析&#xff0c;开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛&#xff0c;多数用户使用Ollama私有化部署且未修改默认配置&#xff0c;存在数据泄露、算力盗…

Sourcetrail 代码分析工具

Sourcetrail 概述 Sourcetrail 是一个代码分析工具&#xff0c;它旨在帮助开发人员理解和导航复杂的代码库。它可以创建代码库的可视化图形&#xff0c;显示代码中的类、函数、变量、依赖关系等信息&#xff0c;从而帮助开发人员更好地理解代码结构和关系&#xff0c;降低维护…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…

《OpenCV》——dlib(人脸应用实例)

文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章&#xff1a;https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331&#xff0c;故此这篇文章只介绍dlib的人…

ArcGIS操作:07 绘制矢量shp面

1、点击目录 2、右侧显示目录 3、选择要存储的文件夹&#xff0c;新建shp 4、定义名称、要素类型、坐标系 5、点击开始编辑 6、点击创建要素 7、右侧选择图层、创建面 8、开始绘制&#xff0c;双击任意位置结束绘制

用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录

用PythonFlask打造可视化武侠人物关系图生成器&#xff1a;从零到一的实战全记录 一、缘起&#xff1a;一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新&#xff0c;我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下&#xff0c;我竟用短短…

2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 阿里云安全实习 一、代码审计经验与思路 二、越权漏洞原理与审计要点 三、SSRF漏洞解析与防御 四、教…

el-select的下拉选择框插入el-checkbox

el-check注意这里要使用model-value绑定数据 <el-selectv-model"selectDevice"multiplecollapse-tags:multiple-limit"5"style"width: 200px"popper-class"select-popover-class" ><el-optionv-for"item in deviceList…

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例1:基础表格

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)

【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信&#xff08;未成功版&#xff09; 上次说基于UDP的打洞程序改了五版一直没有成功&#xff0c;要写一下问题所在&#xff0c;但是我后续又查询了一些资料&#xff0c;成功实现了&#xff0c;这次先写一下未成功的…

C# Unity 唐老狮 No.4 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

数据结构——队列

1. 概念与结构 队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;FIFO, First In First Out&#xff09;的数据结构&#xff0c;即最先被插入队列的数据会最先被删除。队列广泛应用于计算机科学中&#xff0c;特别是在任务调度、缓冲区管理、网络数据传输等领域。…

大语言模型技术发展

摘要 海外闭源模型领域竞争激烈&#xff0c;OpenAI 保持领先地位&#xff0c;而开源模型如 Meta 的 Llama 系列也逐渐崛起。LLM 技术呈现出大型模型和小型模型并行发展的趋势&#xff0c;同时&#xff0c;多模态功能和长上下文能力成为顶级模型的标准配置。MoE 架构的出现推动…

数据结构入门篇——什么是数据结构。

一、引入 工具是一种什么东西呢&#xff1f;是一种转化媒介&#xff0c;我们需要熟食&#xff0c;我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉&#xff0c;通过工具——火的加工&#xff0c;从而得到我们的目的产物——熟肉。 将上面的例子和红字部…

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…

sqli-labs靶场通关

一.less-16 1.寻找注入点 发现url无法回显 构造闭合无论 还是 "都没有任何反应 最后发现闭合符号为")时成功登录 没有回显使用盲注 2.爆数据库 12") or (length(database()))8# 爆出数据库长度 获取数据库名&#xff0c;第一个字母的ascii码值 12") …

使用VSCode Debugger 调试 React项目

点击创建 launch.json 文件 端口号改成我们项目的端口号3000即可&#xff0c;保存 "version": "0.2.0","configurations": [{"type": "chrome","request": "launch","name": "针对 loca…