040-安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR
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 的元数据信息。
{ "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、创建项目引入依赖
com.auth0 java-jwt 3.4.0
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创建如下的前端页面
hello word!!!
this is an HTML page
id:
user:
pass:
jwtdata: -
对应输入id,用户名,密码,点击创建得到eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsInVzZXJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.q__DmCYaffqXmQweBgITek-NmhsSAhgwExNA3lQspQk
-
在官网进行解密
-
在页面对应输入对应jwtdata,进行解密
-
跳转至解密成功页面,回显admin page
5、安全问题
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
-
将true修改为**false** 即可
- : Maven 插件配置的根元素,其中包含了配置的具体内容。
- : 指定了 Java 应用程序的主类。在这里,com.example.testjwt.TestJwtApplication 被指定为主类,表明这是应用程序的入口点。
- : 用于控制插件的执行是否跳过。在这里,设置为 true,表示跳过执行。这可能是因为在某些情况下,你可能希望避免执行特定插件,例如在特定配置下或者在某些阶段跳过构建过程。
-
1、maven-clean-package
-
2、java -jar xxxxxx.jar
②war类型项目
在打包时需要将内置的tomcat插件排除,配置servlet的依赖和修改pom.xml,
然后将war文件放到tomcat安装目录webapps下,启动运行tomcat自动解析即可。
-
War打包
-
1、pom.xml加入或修改:
**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); } **@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // configure() 方法用于配置Spring Boot应用程序的构建,主要用于支持WAR文件的部署。 return builder.sources(TestJwtApplication.class); }** }
-
3、maven-clean-package
-
-
-
-