rsa2048、sha256
rsa2048对整个文件进行hash算法,生成公钥、私钥后用于数字签名,
sha256通过公钥和私钥,作为证书使用。单板打包后对每个动态库sha256计算颁发证书
sha256签名后,rsa2048进行加密。签名用于校验加密数据没有被更改过
通过JWT(JSON Web Token)进行数字签名
签名方法有两种:
1、RS256对应rsa2028、sha256,是非对称算法(rsa2048公私钥),微服务提供签名信息、其他微服务使用
2、HS256对应
内容主要由三部分构成:
开发代码(依赖项):
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
// 如果java版本号是java8以后则需要加一下三个依赖,否者上面一个就好
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>4.0.0</version>
</dependency>
加减密实例代码:
package com.xzbd;
import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.UUID;
@Component
public class JwtUtils {
private long time = 1000 * 60 * 60 * 24;
private String signature = "admin";
public void jwt() {
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
// header
.setHeaderParam("typ", "JWT") // 类型
.setHeaderParam("alg", "HS256") // 校验方法
// payload
.claim("username", "tom") // 用户名
.claim("role", "root") // 角色
.setSubject("主体")
.setExpiration(new Date(System.currentTimeMillis() + time)) // 设置有效时间=当前时间+24小时
.setId(UUID.randomUUID().toString())
// signature
.signWith(SignatureAlgorithm.HS256, signature)
.compact(); // 拼接
// 打印签名数据
System.out.println(jwtToken);
}
public void parse() {
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJyb290Iiwic3ViIjoi5Li75L2TIiwiZXhwIjoxNjYwNzI1NTY2LCJqdGkiOiI1MzZkYjllNy01YzViLTQwNzYtOGU4NS01YmU1ODczNzE5ZDcifQ.oO7QUWfa1Np8cdjvpsUDo_tzrXsDj7GrPJZV8UikRzA";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
}
main函数中如下:
@SpringBootApplication
public class Run {
public static void main(String[] args) {
SpringApplication.run(Run.class, args);
JwtUtils jwtUtils = new JwtUtils();
jwtUtils.jwt();
jwtUtils.parse();
}
}
运行效果如下,生成数据中对上面描述的三部分有符号“.”隔开
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJyb290Iiwic3ViIjoi5Li75L2TIiwiZXhwIjoxNjYwNzI1NjY3LCJqdGkiOiIzZjNkNDg0OC1iNjVhLTQwMjYtYTZiYi0wMWQ1OGI0MTU5YTQifQ.7pVyC8ICj_vAVBL-nrtFnmyDzut8wbwpoILwXsDzQdw
tom
root
536db9e7-5c5b-4076-8e85-5be5873719d7
主体
Wed Aug 17 16:39:26 CST 2022
Process finished with exit code 0