资讯详情

基于私钥生成jwt令牌

1、Jwt令牌回顾

JSON Web Token(JWT)是开放的行业标准(RFC 7519),它定义了一自包含的简介协议格式 双方通信json对象,通过数字签名可以验证和信任传递的信息。JWT可以使用HMAC算法或使用RSA的公 对钥匙/私钥签名,防止篡改。

官网:JSON Web Tokens - jwt.io

标准:RFC 7519 - JSON Web Token (JWT)

JWT令牌的优点:

1、jwt基于json,分析非常方便。

2.丰富的内容可以在令牌中定制,容易扩展。

通过非对称加密算法和数字签名技术,JWT防篡改,安全性高。

4.资源服务的使用JWT授权可以在不依赖认证服务的情况下完成。

缺点:

1、JWT令牌长,存储空间大。

1.1、令牌结构

JWT令牌由三部分组成,每部分中间使用点(.)例如:xxxxx.yyyyy.zzzzz

头包括令牌的类型(即令牌的类型)JWT)使用的哈希算法(如HMAC SHA256或RSA)

例如:

下边是Header部分的内容

{

"alg": "HS256",

"typ": "JWT"

}

使用上述内容Base64Url编码,得到字符串就是JWT令牌的第一部分。

第二部分是负载,内容也是一个json对象,它是存储有效信息的地方,它可以存储jwt提供的现成字段,比 如:iss(签发者),exp(过期时间戳), sub(用户)等,也可以定制字段。

不建议存储敏感信息,因为这部分可以解码还原原始内容。

最后,使用第二部分负载Base64Url编码,得到字符串就是JWT令牌的第二部分。

一个例子:

HMACSHA256(

base64UrlEncode(header) "."

base64UrlEncode(payload),

secret)

base64UrlEncode(header):jwt令牌的第一部分。

base64UrlEncode(payload):jwt令牌的第二部分。

secret:用于签名的密钥。

1.2、生成私钥公钥

JWT使用非对称加密算法生成令牌

生成密钥证书 使用下面的命令生成密钥证书RSA 每个证书包括公钥和私钥

keytool -genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou

Keytool 是一个java提供证书管理工具

-alias:密钥的别名

-keyalg:使用的hash算法

-keypass:访问密码的密钥

-keystore:密钥库文件名,changgou.jks保存生成的证书

-storepass:访问密码的密钥库

查询证书信息:

keytool -list -keystore changgou.jks

2、导出公钥

openssl这这里使用加解密工具包openssl导出公钥信息。

安装 openssl:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

在安装数据目录下Win64OpenSSL-1_1_1b.exe

配置openssl的path环境变量,

cmd进入changgou.jks文件目录执行以下命令:

keytool -list -rfc --keystore changgou.jks | openssl x509 -inform pem -pubkey

以下是公钥

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz oyAm

t47whAaRkRu/8kePM X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnh

cP8ZfxGUH26kX0RK tlrxcrG HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEm

oLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/

iNKotQNnvIAKtjBM4RlIDWMa6dmz lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZS

xtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv

9QIDAQAB

-----END PUBLIC KEY-----

将上面的公钥复制到文本中public.key将文件合并为一行,可放入需要授权认证的项目中。

2.基于私钥生成jwt令牌

2.1、导入maven依赖

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency>

2.2、生成JWT令牌

package com.changgou.oauth;  import com.alibaba.fastjson.JSON; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.security.jwt.Jwt; import org.springframework.security.jwt.JwtHelper; import org.springframework.security.jwt.crypto.sign.RsaSigner; import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;  import java.security.KeyPair; import java.security.interfaces.RSAPrivateKey; import java.util.HashMap; import java.util.Map;  public class CreateJwtTest {     @Test     public void createJWy() {         // 基于私钥生成jwt         // 创建秘钥工厂         /**          * 参数一:指定私钥的位置          * 参数二:指定私钥库的密码          */         ClassPathResource classPathResource = new ClassPathResource("changgou.jks");         String keyPass = "changgou";         KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource, keyPass.toCharArray());          // 基于工厂获取私钥         String alias = "changgou"; // 指定别名         String password = "changgou"; // 指定私钥密码         KeyPair keyPair = keyStoreKeyFactory.getKeyPair(aias, password.toCharArray());
        // 将当前私钥转换为RSA私钥
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

        // 生成jwt
        Map<String, String> map = new HashMap<>();
        map.put("company","heima");
        map.put("address", "beijing");
        Jwt jwt = JwtHelper.encode(JSON.toJSONString(map), new RsaSigner(rsaPrivateKey));
        String jwtEncoded = jwt.getEncoded();
        System.out.println(jwtEncoded);
    }

}

2.3、解析生成JWT令牌 

package com.changgou.oauth;

import org.junit.Test;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.RsaVerifier;

public class ParseJwtTest {
    @Test
    public void paresJwt() {
        // 基于公钥去解析jwt
        String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYmVpamluZyIsImNvbXBhbnkiOiJoZWltYSJ9.cjZNz8G0m4noNYN2VM1SH3ujAtbHElW5Vtbadb0NDI0cjM1DaAXzMA53Qbj4pmVQPl_IfSKqUEXbLxowdRa5NHR43laFsR0kzGbJiTINfSVSroSslYpDdEVwCeAF_a7I-R819YTj4p6sjuYKXbzXpeZQErczFbWWWGR2_U44xH6u1ejRNv8PikFiuzNw-muL7zUJkvqeSJzbEMnQdZMbfvZp4LtSI6B4G_PqpdNXkv19-juxAh99VgJInH_ItF0y5IBOxofA7gRebCZmU8L57gO9ohf2L00D95kis_Ji8lmA1ptLIfXqO_qLVvLBUNH-VtgjGAF0-0pyB-5jlbHP7w";

        String publicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAmt47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnhcP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZSxtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB-----END PUBLIC KEY-----";

        Jwt token = JwtHelper.decodeAndVerify(jwt, new RsaVerifier(publicKey));
        String claims = token.getClaims();
        System.out.println(claims);
    }
}

标签: 轴向位移胀差变送器qbj

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台