农妇山泉一亩田 发表于 2024-6-19 21:46:34

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

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

https://img-blog.csdnimg.cn/img_convert/53ca9af451168b66835a578147b95d37.png
https://img-blog.csdnimg.cn/img_convert/9aca2f165ba6bcb7821460a443151bd2.png
#知识点:

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

   ➢SpringBoot-身份鉴权-JWT技术
➢SpringBoot-打包部署-JAR&WAR
https://img-blog.csdnimg.cn/img_convert/ee4f269b349f470142974dbe5d6299b0.png
#SpringBoot-身份鉴权-JWT技术

JWT(JSON Web Token)是由服务端用加密算法对信息签名来包管其完整性和不可伪造;
Token里可以包罗全部须要信息,这样服务端就无需保存任何关于用户或会话的信息;
JWT用于身份认证、会话维持等。由三部分构成,header、payload与signature。
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 通常用于在网络上安全地传输信息,比方在身份验证过程中传递令牌。
1、创建项目引入依赖

https://img-blog.csdnimg.cn/img_convert/7bdefd3a23791ed7369739dc06ddc4bc.png
https://img-blog.csdnimg.cn/img_convert/9b986f80bc0d7c1f16c4d0ebbab7f966.png
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
https://img-blog.csdnimg.cn/img_convert/44f2d254dff1638fcf47ae90887b113c.png
2、创建JWT并配置JWT

对应目次下创建JwtController.java
// 模拟用户的JWT身份创建,数据的JWT加密

    @PostMapping("/jwtcreate")
    @ResponseBody
    public static String create(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"));**

      //打印创建好的jwt
      System.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")
    @ResponseBody
    public static String jwtcheck(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>

    <!-- Form for 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>

    <!-- Form for checking JWT -->
    <form action="../jwtcheck" method="post">
      jwtdata:<input type="text" name="jwtdata"><br>
      <input type="submit" value="check">
    </form>
</body>
</html>
https://img-blog.csdnimg.cn/img_convert/3914b9a17307986a7d7eecfd176f940c.png
[*] 对应输入id,用户名,密码,点击创建得到eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk
[*] 在官网进行解密
[*] 在页面临应输入对应jwtdata,进行解密
[*] 跳转至解密成功页面,回显admin page
https://img-blog.csdnimg.cn/img_convert/c4f7dbbe7a7e6d37d117c22fbab1af26.png
https://img-blog.csdnimg.cn/img_convert/d71ed2026e7244eb90bf19dee47c34ce.png
https://img-blog.csdnimg.cn/img_convert/ab14cc416ab28660358dd29887b86f79.png
https://img-blog.csdnimg.cn/img_convert/5d7aff1a9425618073b144308cb936cf.png
https://img-blog.csdnimg.cn/img_convert/c0b468203e87650cc0dc9d13b332856e.png
5、安全标题

https://img-blog.csdnimg.cn/img_convert/be66cab81381d0908adfeaadbf3a57c3.png

[*] 只有jwt编码,在jwt官网进行修改用户参数信息,没有使用密匙加密

[*]报错令牌无效
https://img-blog.csdnimg.cn/img_convert/7b5dd3493468a1b826eaae764709d6ae.png
https://img-blog.csdnimg.cn/img_convert/45d2910492cf77a607374b06a40932a9.png
https://img-blog.csdnimg.cn/img_convert/e95b0b1ff20e400e643ac025fb262152.png

[*] 输入密匙,再此修改用户信息

[*]成功登入

https://img-blog.csdnimg.cn/img_convert/e938752813e62212a1d68f10e48f93a2.png
https://img-blog.csdnimg.cn/img_convert/33f5c7849be1cdeb77316bc6def1c7be.png
https://img-blog.csdnimg.cn/img_convert/16711d9868144aaf1be25051310a8a8c.png
1.对于密匙进行爆破

https://img-blog.csdnimg.cn/img_convert/4da7575b55c4ec7641279e6d6721f79c.png
2.未验证签名

https://img-blog.csdnimg.cn/img_convert/cadcc800146ce1900d2f461fdfdc67c8.png
https://img-blog.csdnimg.cn/img_convert/310a3c1234358530c4fc82f870e71c95.png
参考: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中运行。


[*] Jar打包

[*] 报错解决:https://blog.csdn.net/wobenqingfeng/article/details/129914639
https://blog.csdn.net/Mrzhuangr/article/details/124731024
https://img-blog.csdnimg.cn/img_convert/858b9f51a4312876b816171f5c0266cc.png
[*] 将<skip>true</skip>修改为<skip>**false**</skip> 即可

[*]<configuration>: Maven 插件配置的根元素,此中包罗了配置的详细内容。
[*]<mainClass>: 指定了 Java 应用步伐的主类。在这里,com.example.testjwt.TestJwtApplication 被指定为主类,表明这是应用步伐的入口点。
[*]<skip>: 用于控制插件的执行是否跳过。在这里,设置为 true,表示跳过执行。这可能是由于在某些环境下,你可能盼望避免执行特定插件,比方在特定配置下大概在某些阶段跳过构建过程。
https://img-blog.csdnimg.cn/img_convert/5b32e0246a05e7e53d328c81619002b0.png

[*] 1、maven-clean-package
[*] 2、java -jar xxxxxx.jar

https://img-blog.csdnimg.cn/img_convert/3be3f679321d4ca216ec9586516c8d24.png
https://img-blog.csdnimg.cn/img_convert/9d59d2377cc92f7ab08df3415bd92227.png
https://img-blog.csdnimg.cn/img_convert/0fa27c1252bddc8200325b0af5234ff3.png
②war范例项目

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


[*] War打包

[*] 1、pom.xml加入或修改:
**<packaging>war</packaging>**
https://img-blog.csdnimg.cn/img_convert/d55ffed5ef12ef27272f277ae7f8f3c0.png
[*] 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);
    }

    **@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
      // configure() 方法用于配置Spring Boot应用程序的构建,主要用于支持WAR文件的部署。
      return builder.sources(TestJwtApplication.class);
    }**
}

[*] 3、maven-clean-package
https://img-blog.csdnimg.cn/img_convert/be5bbae7bc67b397c92c448c2d97a922.png
   

[*] 碰到报错
https://img-blog.csdnimg.cn/img_convert/e8726eae02ec12bcd801476416af099f.png
https://img-blog.csdnimg.cn/img_convert/aa031d06dbb961769a859da56648306d.png
[*] 4、war放置tomcat的G:\develop\apache-tomcat-9.0.27\**webapps 文件夹**后启动

[*]G:\develop\apache-tomcat-9.0.27\bin运行该文件夹下的tomcat的startup.bat启动步伐

https://img-blog.csdnimg.cn/img_convert/53ded8552e4812eae761ac383343d6b8.png

https://img-blog.csdnimg.cn/img_convert/5b20b823348f3804fa019189c4a3db9b.png
https://img-blog.csdnimg.cn/img_convert/ea29a12884798b16662fc3edcd13b80b.png
https://img-blog.csdnimg.cn/img_convert/068cf5790f4e7adcc54e777189c3f749.png
https://img-blog.csdnimg.cn/img_convert/6f76f80eeaeaf8ed4c880a622d736105.png
JAVAEE源码架构:

无源码下载走漏风险



[*]无下载路径,运行的步伐是一个压缩包,不能通过访问下载路径去下载源码
https://img-blog.csdnimg.cn/img_convert/f15f03bb1d6b8f20dd59caae1093a939.png
https://img-blog.csdnimg.cn/img_convert/47b79fd303235181cce6ca2285193c53.png
源码走漏也需反编译



[*]如果得到打包好的源码,将打包的源码进行解压
https://img-blog.csdnimg.cn/img_convert/3b013e7b8877de8adf1d78e6529bf28a.png


[*]直接使用idea打开文件夹,即可实现自动反编译,看到源码
https://img-blog.csdnimg.cn/img_convert/781eabdaeb8ed561e26cb12922e0f88a.png
https://img-blog.csdnimg.cn/img_convert/21c49e7178e12c57404844fa695fd9b5.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 040-安全开辟-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR