0


040-安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR

040-安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR

Untitled

Untitled

#知识点:

1、JavaEE-SpringBoot-身份鉴权-JWT技术
2、JavaEE-SpringBoot-打包部署-JAR&WAR

演示案例:

➢SpringBoot-身份鉴权-JWT技术
➢SpringBoot-打包部署-JAR&WAR

Untitled

#SpringBoot-身份鉴权-JWT技术

JWT(JSON Web Token)是由服务端用加密算法对信息签名来保证其完整性和不可伪造;
Token里可以包含所有必要信息,这样服务端就无需保存任何关于用户或会话的信息;
JWT用于身份认证、会话维持等。由三部分组成,header、payload与signature。

Header

Payload

Signature

是 JSON Web Token(JWT)的三个主要组成部分。

  1. Header(头部): JWT 的头部通常包含两部分信息:声明类型(typ)和使用的签名算法(alg)。这些信息以 JSON 格式存在,然后进行 Base64 编码,形成 JWT 的第一个部分。头部用于描述关于该 JWT 的元数据信息。{"alg":"HS256","typ":"JWT"}
  2. Payload(负载): JWT 的负载包含有关 JWT 主题(subject)及其它声明的信息。与头部一样,负载也是以 JSON 格式存在,然后进行 Base64 编码,形成 JWT 的第二个部分。{"sub":"1234567890","name":"John Doe","iat":1516239022}
  3. Signature(签名): JWT 的签名是由头部、负载以及一个密钥生成的,用于验证 JWT 的真实性和完整性。签名是由指定的签名算法对经过 Base64 编码的头部和负载组合而成的字符串进行签名生成的。例如,使用 HMAC SHA-256 算法生成签名:HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

最终,JWT 是由这三个部分组成的字符串,形如

**header.payload.signature**

。JWT 通常用于在网络上安全地传输信息,例如在身份验证过程中传递令牌。

1、创建项目引入依赖

Untitled

Untitled

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

Untitled

2、创建JWT并配置JWT

对应目录下创建

JwtController.java
// 模拟用户的JWT身份创建,数据的JWT加密@PostMapping("/jwtcreate")@ResponseBodypublicstaticStringcreate(Integer id,String user,String pass){/**/ 创建JWT令牌
        String jwttoken =JWT.create()// 设置创建的Header部分//.withHeader()// 设置创建的Payload部分.withClaim("userid", id).withClaim("username", user).withClaim("password", pass)// 设置时效(JWT过期时间)//.withExpiresAt()// 创建设置的Signature部分,指定算法和密钥.sign(Algorithm.HMAC256("xiaodisec"));**//打印创建好的jwtSystem.out.println(jwttoken);return jwttoken;}

3、解析JWT

//构建解密注册
JWTVerifier jwt = JWT.require(Algorithm.HMAC256(“xiaodisec”)).build();
//解密注册数据
DecodedJWT verify = jwt.verify(jwtdata);
//提取解密数据
Integer userid = verify.getClaim(“userid”).asInt();

// 模拟JWT身份的检测,JWT数据解密@PostMapping("/jwtcheck")@ResponseBodypublicstaticStringjwtcheck(String jwtdata){// 构建JWT解密注册**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?";// }// 提取Header部分// verify.getHeader();// 提取Sign签名部分// verify.getSignature();}}

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

  • 在resources→static→index.html创建如下的前端页面<html><body><h1>hello word!!!</h1><p>this is an HTML page</p><!--Formfor creating JWT--><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><!--Formfor checking JWT--><form action="../jwtcheck" method="post"> jwtdata:<input type="text" name="jwtdata"><br><input type="submit" value="check"></form></body></html>Untitled
  • 对应输入id,用户名,密码,点击创建得到eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk
  • 在官网进行解密
  • 在页面对应输入对应jwtdata,进行解密
  • 跳转至解密成功页面,回显admin page

Untitled

Untitled

Untitled

Untitled

Untitled

5、安全问题

Untitled

  1. 只有jwt编码,在jwt官网进行修改用户参数信息,没有使用密匙加密1. 报错令牌无效UntitledUntitledUntitled
  2. 输入密匙,再此修改用户信息1. 成功登入

Untitled

Untitled

Untitled

1.对于密匙进行爆破

Untitled

2.未验证签名

Untitled

Untitled

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

#SpringBoot-打包部署-JAR&WAR

参考:https://mp.weixin.qq.com/s/HyqVt7EMFcuKXfiejtfleg
SpringBoot项目打包在linux服务器中运行:

①jar类型项目

jar类型项目使用SpringBoot打包插件打包时,会在打成的jar中内置tomcat的jar。
所以使用jdk直接运行jar即可,jar项目中功能将代码放到其内置的tomcat中运行。

Untitled

Untitled

Untitled

②war类型项目

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

  • War打包- 1、pom.xml加入或修改:**<packaging>war</packaging>**Untitled- 2、启动类里面加入配置:@SpringBootApplication// @SpringBootApplication 注解用于标识这是一个Spring Boot应用程序的主类,它会自动扫描并加载与主类同包或子包下的组件。publicclassTestJwtApplication**extendsSpringBootServletInitializer**{publicstaticvoidmain(String[] args){// SpringApplication.run() 用于启动Spring Boot应用程序。SpringApplication.run(TestJwtApplication.class, args);}**@OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilder builder){// configure() 方法用于配置Spring Boot应用程序的构建,主要用于支持WAR文件的部署。return builder.sources(TestJwtApplication.class);}**}- 3、maven-clean-packageUntitled- 遇到报错UntitledUntitled- 4、war放置tomcat的G:\develop\apache-tomcat-9.0.27\**webapps 文件夹后启动- G:\develop\apache-tomcat-9.0.27\bin运行该文件夹下的tomcat的startup.bat启动程序**Untitled

Untitled

Untitled

Untitled

Untitled

JAVAEE源码架构:

无源码下载泄漏风险

  • 无下载路径,运行的程序是一个压缩包,不能通过访问下载路径去下载源码

Untitled

Untitled

源码泄漏也需反编译

  • 如果得到打包好的源码,将打包的源码进行解压

Untitled

  • 直接使用idea打开文件夹,即可实现自动反编译,看到源码

Untitled

Untitled


本文转载自: https://blog.csdn.net/wushangyu32335/article/details/136141089
版权归原作者 wusuowei2986 所有, 如有侵权,请联系我们删除。

“040-安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR”的评论:

还没有评论