Token_使用JWT生成token

使用token替换session保存信息,防篡改

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 }

时间: 2024-11-04 17:36:40

Token_使用JWT生成token的相关文章

从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)

在 上一篇中讲到了在NetCore项目中如何进行全局的请求模型验证,只要在请求模型中加了验证特性,接口使用时只用将数据拿来使用,而不用去关系数据是否符合业务需求. 这篇中将讲些个人对于JWT的看法和使用,在网上也能找到很多相关资料和如何使用,基本都是直接嵌到  Startup 类中来单独使用.而博主是将jwt当做一个验证方法来使用.使用起来更加方便,并且在做验证时也更加的灵活. 1.什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON

jwt laravel 使用 jwttoken解析token jwt生成token jwt令牌验证

本文介绍jwt token在laravel中的安装使用,解决token验证的问题 一.查看laravel版本选定适合自己框架的jwt版本,不同版本之间会有意想不到的惊喜(坑) 根据自己 laravel版本不同使用jwt-auth版本建议如下: Laravel version jwt-auth version 4.* 0.3.* 0.4.* 5.* && <5.5 0.5.* 5.* 1.0.* 以上只是参考,本人在laravel5.4也成功使用了1.0.0-rc.3版本下面详细描述下

jwt的应用生成token,redis做储存

解释一下JWT JWT就是一个字符串,经过加密处理与校验处理的字符串,由三个部分组成.基于token的身份验证可以替代传统的cookie+session身份验证方法.三个部分分别如下: header.payload.signature header部分组成 header 格式为: { "typ":"JWT", "alg":"HS256" } 这就是一个json串,两个字段都是必须的,alg字段指定了生成signature的算法

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载)

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载) 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数据,这种情况我们是要防止发生的. 2.解决方法: ①前端处理:在提交之后通过js立即将按钮

SpringBoot集成JWT实现token验证

原文:https://www.jianshu.com/p/e88d3f8151db JWT官网: https://jwt.io/ JWT(Java版)的github地址:https://github.com/jwtk/jjwt 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息.因为数字签名的存在,这些信息是可信的,JWT

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

原文:[.NET Core项目实战-统一认证平台]第十二章 授权篇-深入理解JWT生成及验证流程 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,

什么是token及怎样生成token

什么是token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 基于 Token 的身份验证 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 客户

生成token

利用中间件生成token 1.安装中间件 npm install jsonwebtoken 2. 使用 Sign() 里面有3个参数,第一个是token里面传递的数据    ,第二个是 key ,第三个是过期s时间 const payload = { id: user.id, name: user.name, avatar: user.avatar }; const token = jwt.sign(payload, keys.secretOrKey, { expiresIn: 3600 });

使用JWT实现Token认证

为什么使用JWT? 随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单. JWT架构图 JWT架构图.png 使用JWT核心代码: maven依赖: <dependency> <groupId>