目录
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")
@ResponseBody
public 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")
@ResponseBody
public 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打包运行方式:
- 在 IDEA 中右侧打开 Maven,点击生命周期,一般需双击 clean 清除一下缓存。
- 然后双击 package,等待运行完毕,目录下会多一个 target 目录
- 复制其中的.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); } **@Override protected 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 直接打开项目,会自动反编译得到源码,不过项目里面的注释会消失。