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

打印 上一主题 下一主题

主题 864|帖子 864|积分 2594

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



#知识点:

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

  演示案例:

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

  

#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 的元数据信息。
    1. {
    2.   "alg": "HS256",
    3.   "typ": "JWT"
    4. }
    复制代码
  • Payload(负载): JWT 的负载包罗有关 JWT 主题(subject)及其它声明的信息。与头部一样,负载也是以 JSON 格式存在,然后进行 Base64 编码,形成 JWT 的第二个部分。
    1. {
    2.   "sub": "1234567890",
    3.   "name": "John Doe",
    4.   "iat": 1516239022
    5. }
    复制代码
  • Signature(署名): JWT 的署名是由头部、负载以及一个密钥天生的,用于验证 JWT 的真实性和完备性。署名是由指定的署名算法对颠末 Base64 编码的头部和负载组合而成的字符串进行署名天生的。
    例如,利用 HMAC SHA-256 算法天生署名:
    1. HMACSHA256(
    2.   base64UrlEncode(header) + "." +
    3.   base64UrlEncode(payload),
    4.   secret
    5. )
    复制代码
终极,JWT 是由这三个部分构成的字符串,形如 **header.payload.signature**。JWT 通常用于在网络上安全地传输信息,例如在身份验证过程中通报令牌。
1、创建项目引入依赖



  1. <dependency>
  2. <groupId>com.auth0</groupId>
  3. <artifactId>java-jwt</artifactId>
  4. <version>3.4.0</version>
  5. </dependency>
复制代码

2、创建JWT并配置JWT

对应目录下创建JwtController.java
  1. // 模拟用户的JWT身份创建,数据的JWT加密
  2.     @PostMapping("/jwtcreate")
  3.     @ResponseBody
  4.     public static String create(Integer id, String user, String pass) {
  5.         /**/ 创建JWT令牌
  6.         String jwttoken = JWT.create()
  7.                 // 设置创建的Header部分
  8.                 //.withHeader()
  9.                 // 设置创建的Payload部分
  10.                 .withClaim("userid", id)
  11.                 .withClaim("username", user)
  12.                 .withClaim("password", pass)
  13.                 // 设置时效(JWT过期时间)
  14.                 //.withExpiresAt()
  15.                 // 创建设置的Signature部分,指定算法和密钥
  16.                 .sign(Algorithm.HMAC256("xiaodisec"));**
  17.         //打印创建好的jwt
  18.         System.out.println(jwttoken);
  19.         return jwttoken;
  20.     }
复制代码
3、剖析JWT

//构建解密注册
JWTVerifier jwt = JWT.require(Algorithm.HMAC256(“xiaodisec”)).build();
//解密注册数据
DecodedJWT verify = jwt.verify(jwtdata);
//提取解密数据
Integer userid = verify.getClaim(“userid”).asInt();
  1. // 模拟JWT身份的检测,JWT数据解密
  2.     @PostMapping("/jwtcheck")
  3.     @ResponseBody
  4.     public static String jwtcheck(String jwtdata) {
  5.         // 构建JWT解密注册
  6.         **JWTVerifier jwt = JWT.require(Algorithm.HMAC256("xiaodisec")).build();**
  7.         // 解密注册数据
  8.         **DecodedJWT verify = jwt.verify(jwtdata);**
  9.         // 提取注册解密数据Payload部分
  10.         **Integer userid = verify.getClaim("userid").asInt();
  11.         String username = verify.getClaim("username").asString();
  12.         String password = verify.getClaim("password").asString();**
  13.         System.out.println(userid + username + password);
  14.         return "admin page";
  15.         // 如果需要根据解密的数据执行不同的逻辑,可以使用以下代码进行判断
  16.         // if (username.equals("admin")) {
  17.         //     return "admin";
  18.         // } else {
  19.         //     return "gay?";
  20.         // }
  21.         // 提取Header部分
  22.         // verify.getHeader();
  23.         // 提取Sign签名部分
  24.         // verify.getSignature();
  25.     }
  26. }
复制代码
4、配置前端提交数据访问客户端页面



  • 在resources→static→index.html创建如下的前端页面
    1. <html>
    2. <body>
    3.     <h1>hello word!!!</h1>
    4.     <p>this is an HTML page</p>
    5.     <!-- Form for creating JWT -->
    6.     <form action="../jwtcreate" method="post">
    7.         id:<input type="text" name="id"><br>
    8.         user:<input type="text" name="user"><br>
    9.         pass:<input type="text" name="pass"><br>
    10.         <input type="submit" value="create">
    11.     </form>
    12.     <!-- Form for checking JWT -->
    13.     <form action="../jwtcheck" method="post">
    14.         jwtdata:<input type="text" name="jwtdata"><br>
    15.         <input type="submit" value="check">
    16.     </form>
    17. </body>
    18. </html>
    复制代码

  • 对应输入id,用户名,暗码,点击创建得到eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk
  • 在官网进行解密
  • 在页面临应输入对应jwtdata,进行解密
  • 跳转至解密成功页面,回显admin page





5、安全题目



  • 只有jwt编码,在jwt官网进行修改用户参数信息,没有利用密匙加密

    • 报错令牌无效




  • 输入密匙,再此修改用户信息

    • 成功登入




1.对于密匙进行爆破


2.未验证署名



参考: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

    • 将<skip>true</skip>修改为<skip>**false**</skip> 即可

      • <configuration>: Maven 插件配置的根元素,此中包罗了配置的具体内容。
      • <mainClass>: 指定了 Java 应用程序的主类。在这里,com.example.testjwt.TestJwtApplication 被指定为主类,表明这是应用程序的入口点。
      • <skip>: 用于控制插件的执行是否跳过。在这里,设置为 true,表示跳过执行。这可能是因为在某些环境下,你可能盼望避免执行特定插件,例如在特定配置下或者在某些阶段跳过构建过程。


    • 1、maven-clean-package
    • 2、java -jar xxxxxx.jar




②war类型项目

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


  • War打包

    • 1、pom.xml参加或修改:
      **<packaging>war</packaging>**

    • 2、启动类内里参加配置:
      1. @SpringBootApplication
      2. // @SpringBootApplication 注解用于标识这是一个Spring Boot应用程序的主类,它会自动扫描并加载与主类同包或子包下的组件。
      3. public class TestJwtApplication **extends SpringBootServletInitializer** {
      4.     public static void main(String[] args) {
      5.         // SpringApplication.run() 用于启动Spring Boot应用程序。
      6.         SpringApplication.run(TestJwtApplication.class, args);
      7.     }
      8.     **@Override
      9.     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
      10.         // configure() 方法用于配置Spring Boot应用程序的构建,主要用于支持WAR文件的部署。
      11.         return builder.sources(TestJwtApplication.class);
      12.     }**
      13. }
      复制代码
    • 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源码架构:

无源码下载泄漏风险



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


源码泄漏也需反编译



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



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



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表