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

本文主要是介绍Day40:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

SpringBoot-身份鉴权-JWT技术

SpringBoot-打包部署-JAR&WAR

思维导图


Java知识点

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等.

框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等

技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方组件安全等,架构分析,待补充

SpringBoot-身份鉴权-JWT技术

JWT ( JSON  Web Token ) 是由服务端用加密算法对信息签名来保证其完整性和不可伪造;

Token里可以包含所有必要信息,这样服务端就无需保存任何关于用户或会话的信息;

JWT用于身份认证、会话维持等。由三部分组成,header、payload与signature。

参考:https://cloud.tencent.com/developer/article/2101634

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 SHA-256 算法生成签名:

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

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

创建项目引入依赖

引入依赖:

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

项目目录如下:

创建JWT并配置JWT,对应目录下创建JwtController.java

package cn.xiaodi.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 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;}//模拟JWT身份的检测 jwt数据解密@PostMapping("/jwtcheck")@ResponseBodypublic static String  jwtcheck(String jwtdata){//String jwtdata="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6ImExMjM0NTYiLCJ1c2VyaWQiOjEsInVzZXJuYW1lIjoiYWRtaW4ifQ.nkMIxHJKyGAHa3aDtTAy5_9j51yWDTQHEL8n-dqE33w";//构建解密注册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);return "admin page";//        if(username.equals("admin")){
//            return "admin";
//        }else {
//            return "gay?";
//        }//攻击者要模拟使用xiaodi用户去登录//提取header部分//verify.getHeader();//提取sign签名部分//verify.getSignature();}}

配置前端提交数据访问客户端页面,在resources→static→index.html创建如下的前端页面

<html>
<body>
<h1>hello word!!!</h1>
<p>this is a html page</p><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></body>
</html>

对应输入id,用户名,密码,点击创建得到token

在官网进行解密,在页面对应输入对应jwtdata,进行解密

跳转至解密成功页面,回显admin page

为什么说jwt是安全的?

因为token解密加密需要密钥,密钥都保存在服务端里。你可以轻易伪造出用户信息但是得不到密钥,就无法通过服务端token解密,鉴权失败。

所以很多开发者往往是密文能被解密,就认定通过。

安全问题:

 

SpringBoot-打包部署-JAR&WAR

参考:https://mp.weixin.qq.com/s/HyqVt7EMFcuKXfiejtfleg
SpringBoot项目打包在linux服务器中运行:
①jar类型项目
        jar类型项目使用SpringBoot打包插件打包时,会在打成的jar中内置tomcat的jar。
        所以使用jdk直接运行jar即可,jar项目中功能将代码放到其内置的tomcat中运行。
②war类型项目
        在打包时需要将内置的tomcat插件排除,配置servlet的依赖和修改pom.xml,
        然后将war文件放到tomcat安装目录webapps下,启动运行tomcat自动解析即可。

Jar打包运行方式:

  1. 在 IDEA 中右侧打开 Maven,点击生命周期,一般需双击 clean 清除一下缓存。
  2. 然后双击 package,等待运行完毕,目录下会多一个 target 目录
  3. 复制其中的.jar 文件到目标服务器,运行以下命令即可

报错解决:

https://blog.csdn.net/Mrzhuangr/article/details/124731024

https://blog.csdn.net/wobenqingfeng/article/details/129914639

War类型项目

1、pom.xml加入或修改:<packaging>war</packaging>

若无则直接添加,若有 packaging 但是为 jar,则修改为 war 即可
 

2、启动类里面加入配置

@SpringBootApplication
// @SpringBootApplication 注解用于标识这是一个Spring Boot应用程序的主类,它会自动扫描并加载与主类同包或子包下的组件。
public class TestJwtApplication **extends SpringBootServletInitializer** {public static void main(String[] args) {// SpringApplication.run() 用于启动Spring Boot应用程序。SpringApplication.run(TestJwtApplication.class, args);}**@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {// configure() 方法用于配置Spring Boot应用程序的构建,主要用于支持WAR文件的部署。return builder.sources(TestJwtApplication.class);}**
}

3、maven-clean-package

4、war放置tomcat的G:\develop\apache-tomcat-9.0.27\webapps 文件夹后启动

G:\develop\apache-tomcat-9.0.27\bin运行该文件夹下的tomcat的startup.bat启动程序

JAVAEE 源码架构:无源码下载泄漏风险;源码泄漏也需反编译

无源码下载泄漏风险:网站应用是运行jar的形式,类似exe客户端

没有泄露的风险

源码泄漏也需反编译

最简单的 jar 包反编译方法:解压缩直接将 jar 包解压出来后使用 IDEA 直接打开项目,会自动反编译得到源码,不过项目里面的注释会消失。

思维导图

这篇关于Day40:安全开发-JavaEE应用SpringBoot框架JWT身份鉴权打包部署JARWAR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三