Token_使用JWT生成token
1.token三部分
header
{
"typ": "JWT",
"alg": "HS256"
}
payload
{
"iss": "ninghao.net",
"exp": "1438955445",
"name": "wanghao",
"admin": true
}
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
signature
先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
2.Base64 编码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
3.token生成 验证
生成token
1 import java.lang.reflect.Field;
2 import java.lang.reflect.Modifier;
3 import java.security.Key;
4 import java.util.Date;
5 import java.util.TreeMap;
6 import java.util.UUID;
7
8 import com.alibaba.fastjson.JSONObject;
9
10 import io.jsonwebtoken.JwtBuilder;
11 import io.jsonwebtoken.Jwts;
12 import io.jsonwebtoken.SignatureAlgorithm;
13
14 public class SignToken {
15 private String id; // token对外的ID号
16
17 private String mid; // 开发者编号
18 private String docId; // 合同编号
19 private String devId; // 签约的ID号码
20
21 private Date createTime; // Token的创建时间
22 private Date expiredIn; // Token的过期时间
23
24 private String value; // token的值
25
26 public SignToken(String mid, String docId, String devId) {
27 this.id=getUID();
28 this.mid = mid;
29 this.docId = docId;
30 this.devId = devId;
31 }
32
33
34 public static synchronized String getUID() {
35 UUID uuid = UUID.randomUUID();
36 return uuid.toString().replace("-", "");
37 }
38
39
40 /////////////////////////////////////////////////////////
41 public void setData(String jsonString) {
42 JSONObject json = JSONObject.parseObject(jsonString);
43 this.setData(json);
44 }
45 public String toJSONString() {
46 return this.toJSONObject().toJSONString();
47 }
48
49 public void setData(JSONObject json) {
50 Class<?> clazz = this.getClass();
51 for (String name: json.keySet()) {
52 Object value = json.get(name);
53 try {
54 Field field = clazz.getDeclaredField(name);
55 field.setAccessible(true);
56 field.set(this, value);
57 } catch (IllegalArgumentException e) {
58 e.printStackTrace();
59 } catch (IllegalAccessException e) {
60 e.printStackTrace();
61 } catch (NoSuchFieldException e) {
62 e.printStackTrace();
63 } catch (SecurityException e) {
64 e.printStackTrace();
65 }
66 }
67 }
68
69 public JSONObject toJSONObject() {
70 Field[] fields = this.getClass().getDeclaredFields();
71 if (fields.length == 0) {
72 return null;
73 }
74 TreeMap<String, Object> map = new TreeMap<String, Object>();
75 for (int i = 0; i < fields.length; i++) {
76 Field field = fields[i];
77 int modifier = field.getModifiers();
78 //if (!Modifier.isPublic(modifier) || Modifier.isStatic(modifier) || Modifier.isFinal(modifier)) {
79 // continue;
80 //}
81 if (Modifier.isStatic(modifier) || Modifier.isFinal(modifier)) {
82 continue;
83 }
84 field.setAccessible(true);
85 String name = field.getName();
86 Object value = null;
87 try {
88 value = field.get(this);
89 } catch (IllegalArgumentException e) {
90 continue;
91 } catch (IllegalAccessException e) {
92 continue;
93 }
94 map.put(name, value);
95 }
96 JSONObject object = new JSONObject(map);
97 return object;
98 }
99
100
101
102 public String getId() {
103 return id;
104 }
105
106 public void setId(String id) {
107 this.id = id;
108 }
109
110 public String getMid() {
111 return mid;
112 }
113
114 public void setMid(String mid) {
115 this.mid = mid;
116 }
117
118 public String getDocId() {
119 return docId;
120 }
121
122 public void setDocId(String docId) {
123 this.docId = docId;
124 }
125
126 public String getDevId() {
127 return devId;
128 }
129
130 public void setDevId(String devId) {
131 this.devId = devId;
132 }
133
134 public Date getCreateTime() {
135 return createTime;
136 }
137
138 public void setCreateTime(Date createTime) {
139 this.createTime = createTime;
140 }
141
142 public Date getExpiredIn() {
143 return expiredIn;
144 }
145
146 public void setExpiredIn(Date expiredIn) {
147 this.expiredIn = expiredIn;
148 }
149
150 public String getValue() {
151 return value;
152 }
153
154 public void setValue(String value) {
155 this.value = value;
156 }
157
158 }
验签
1 package cn.bestsign.mixed.token;
2
3 import java.security.InvalidKeyException;
4 import java.security.Key;
5 import java.security.KeyFactory;
6 import java.security.KeyPair;
7 import java.security.KeyPairGenerator;
8 import java.security.NoSuchAlgorithmException;
9 import java.security.PrivateKey;
10
11 import java.security.Signature;
12 import java.security.SignatureException;
13 import java.security.interfaces.RSAPrivateKey;
14 import java.security.interfaces.RSAPublicKey;
15 import java.security.spec.InvalidKeySpecException;
16 import java.security.spec.PKCS8EncodedKeySpec;
17 import java.security.spec.X509EncodedKeySpec;
18 import java.util.Base64;
19 import java.util.Date;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import javax.xml.bind.DatatypeConverter;
24
25 import org.junit.Test;
26
27 import cn.gov.shnotary.fingerprint.service.PublicKey;
28 import io.jsonwebtoken.Jwt;
29 import io.jsonwebtoken.JwtBuilder;
30 import io.jsonwebtoken.Jwts;
31 import io.jsonwebtoken.SignatureAlgorithm;
32 import io.jsonwebtoken.impl.crypto.RsaProvider;
33 import net.sf.json.JSONObject;
34
35 public class SignTokenTest {
36
37 @Test
38 public void generateTokenTest3() throws Exception {
39 String pubKey="xxx";
40 String priKey="xxx";
41 byte[] privateKeyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(priKey);
42 byte[] pubKeyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(pubKey);
43
44 PrivateKey privateKey = getPrivateKey("RSA", privateKeyBytes);
45 java.security.PublicKey publicKey = getPublicKey("RSA", pubKeyBytes);
46
47 SignToken token1 = generateToken("E0000000000000000009", "101101-00000004", "13003618788", 7, SignatureAlgorithm.RS256, privateKey);
48 System.out.println(token1.getValue());
49 String tokenString = token1.getValue();
50 Jwt jwt = Jwts.parser().setSigningKey(publicKey).parse(tokenString);
51 System.out.println(jwt.getHeader());
52 System.out.println(jwt.getBody());
53 Jwt jwt = verifyToken(pubKey, token1.getValue());
54 System.out.println(jwt.getHeader());
55 System.out.println(jwt.getBody());
56 JSONObject json = JSONObject.fromObject(jwt.getBody());
57 JSONObject aud = json.getJSONObject("aud");
58 System.out.println(aud);
59 }
60
61 public static PrivateKey getPrivateKey(String KEY_ALGORITHM, byte[] priKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
62 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
63 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
64 return keyFactory.generatePrivate(pkcs8KeySpec);
65 }
66
67 public static java.security.PublicKey getPublicKey(String KEY_ALGORITHM, byte[] pubKey) throws InvalidKeySpecException, NoSuchAlgorithmException {
68
69 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
70 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
71 return keyFactory.generatePublic(x509KeySpec);
72 }
73
74 @Test
75 public void generateTokenTest2() throws Exception {
76 String pubKey="";
77 String priKey="";
78
79 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
80 // 初始化密钥对儿生成器
81 keyPairGen.initialize(512);
82 // 生成密钥对儿
83 KeyPair keyPair = keyPairGen.generateKeyPair();
84 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
85 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
86
87 SignToken token1 = generateToken("460cfedac66149c2a832e66fa1de28a6", "101101-00000004", "13003618788", 7, SignatureAlgorithm.RS256, privateKey);
88 System.out.println(token1.getValue());
89 String tokenString = token1.getValue();
90 Jwt jwt = Jwts.parser().setSigningKey(publicKey).parse(tokenString);
91 System.out.println(jwt.getHeader());
92 System.out.println(jwt.getBody());
93 }
94
95
96
97 @Test
98 public void generateTokenTest1() throws Exception {
99 KeyPair kp = RsaProvider.generateKeyPair(512);
100 java.security.PublicKey publicKey = kp.getPublic();
101 PrivateKey privateKey = kp.getPrivate();
102
103 SignToken token1 = generateToken("460cfedac66149c2a832e66fa1de28a6", "101101-00000004", "13003618788", 7, SignatureAlgorithm.RS256, privateKey);
104 System.out.println(token1.getValue());
105 String tokenString = token1.getValue();
106
107 // String tokenInfo[] = tokenString.split("\\.");
108 // for (String str : tokenInfo) {
109 //
110 // // String info = new String(Base64.getDecoder().decode(str));
111 // // System.out.println(info);
112 // }
113
114 Jwt jwt = Jwts.parser().setSigningKey(publicKey).parse(tokenString);
115 System.out.println(jwt.getHeader());
116 System.out.println(jwt.getBody());
117
118 // Jwts.parser().setSigningKey(publicKey).parseClaimsJws(jwt).getBody();
119
120 }
121
122 public SignToken generateToken(String mid, String docId, String devId, long delay, SignatureAlgorithm alg, Key signingKey) {
123 SignToken token = new SignToken(mid, docId, devId);
124 // 定义开始时间
125 Date now = new Date();
126 Date end = new Date(now.getTime() + delay * 24 * 60 * 60 * 1000);
127 token.setCreateTime(now);
128 token.setExpiredIn(end);
129
130 // 构建一个Token
131 JwtBuilder builder = Jwts.builder().setId(token.getId());
132 builder.setIssuedAt(token.getCreateTime()); // Token颁布的时间
133 builder.setExpiration(token.getExpiredIn()); // Token失效的时间
134
135 builder.setIssuer(mid); //发行者 授权者"ssqian.com.cn"
136 builder.setSubject("hand-sign"); //主题
137 builder.setAudience(token.toJSONString()); // 观众
138 builder.signWith(alg, signingKey);
139
140 token.setValue(builder.compact());
141 return token;
142
143 }
144
145 public static byte[] rsaSign(byte[] data, String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
146 // 解密由base64编码的私钥
147 byte[] privateKeyBytes = org.apache.commons.codec.binary.Base64.decodeBase64(privateKey);
148
149 // 构造PKCS8EncodedKeySpec对象
150 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
151
152 // KEY_ALGORITHM 指定的加密算法
153 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
154
155 // 取私钥匙对象
156 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
157
158 // 用私钥对信息生成数字签名
159 Signature signature = Signature.getInstance("SHA1withRSA");
160 signature.initSign(priKey);
161 signature.update(data);
162
163 return signature.sign();
164 }
165
166
167 }
Token_使用JWT生成token的更多相关文章
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- 使用 JWT 生成 Token 代码示例
JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...
- JWT生成token及过期处理方案
业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...
- tp5使用jwt生成token,做api的用户认证
首先 composer 安装 firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...
- .NET6 JWT(生成Token令牌)
一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...
- JWT生成Token做登录校验
一.JWT的优点 1.服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销. 2.jwt构成简单,占用很少的字节,便于传输. 3.json格式通用,不同语言之间都可以使用. 二.使用JWT进 ...
- JSON Web Token (JWT)生成Token及解密实战。
昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...
随机推荐
- CodeForcs 797E Array Queries
$dp$预处理,暴力. 如果$k > sqrt(n)$,那么答案不会超过$sqrt(n)$,暴力模拟即可.如果$k <= sqrt(n)$,那么可以$dp$预处理打表. #include ...
- java浅拷贝和深拷贝(基础也是很重要的)
对象的copy你兴许只是懵懂,或者是并没在意,来了解下吧. 对于的github基础代码https://github.com/chywx/JavaSE 最近学习c++,跟java很是相像,在慕课网学习c ...
- 表视图(UITableView)与表视图控制器(UITableViewController)
表视图(UITableView)与表视图控制器(UITableViewController)其实是一回事. 表视图控制器是一种只能显示表视图的标准视图控制器,可在表视图占据整个视图时使用这种控制器.虽 ...
- android 进程优先级
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 前台进程 可见进程 服务进程 后台进程 空进程
- java 继承 String类
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha String 类 是 final修饰 , 是不能 继承的.
- 网络流小结+[jzyzoj p1320] patrol
一个不能更清楚的网络流介绍 ↑虽然不是我写的但是观摩一下总是没问题的嗯 看到晗神学的是神奇的ek算法. 但是看起来还是Ford-Fulkerson比较简单..所以我就学了这个...嗯其他的先看看. ...
- iOS Masonry的使用需要注意的地方
自动布局最重要的是约束:UI元素间关系的数学表达式.约束包括尺寸.由优先级和阈值管理的相对位置.它们是添加剂,可能导致约束冲突 .约束不足造成布局无法确定 .这两种情况都会产生异常. 使用前:Auto ...
- sql中字符分割,日期判断,以及函数的应用
前两天公司有一个功能需求,客户给出几天的工作时间和休息,然后顾客的访问时间必须要在工作时间之内和休息时间之外,所以要求做一下判断.本来以为这个没什么,谁知道客户提供的工作时间段和休息时间段不定,给出的 ...
- 使用本地的Nuget Repository加速Nuget访问速度
Nuget是一个在VisualStudio下的非常好用的包管理器,然而由于众所周知的原因,其访问速度非常令人抓狂,甚至抽风.在没有VPN的环境下,如何解决这一问题呢?常见的解决方案是自己搭建一个Nug ...
- External components provide true shutdown for boost converter
The step-up switching-converter circuit in Figure 1 presents a familiar problem: If you shut down bo ...