首页 > 编程语言 >java开发jwt示例

java开发jwt示例

时间:2023-05-31 10:14:51浏览次数:38  
标签:java String 示例 jwt RSA import security public

pom文件引入

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.15.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.15.1</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>

ras生成工具类

import java.security.spec.InvalidKeySpecException;
import java.util.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * Java RSA 加密工具类
 *
 */
public class RSAUtils {

    /**
     * 密钥长度 于原文长度对应 以及越长速度越慢
     */
    private final static int KEY_SIZE = 1024;

    public static KeyPair createKeyPair(int size) throws NoSuchAlgorithmException {
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器
        keyPairGen.initialize(Math.max(size, KEY_SIZE), new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        return keyPair;
    }

    /**
     * 随机生成密钥对
     */
    public static String[] genKeyPair(int size) throws NoSuchAlgorithmException {
        KeyPair keyPair = createKeyPair(size);
        // 得到私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        // 得到私钥字符串
        String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
        // 将公钥和私钥保存到Map
        return new String[]{publicKeyString, privateKeyString};
    }

    public static RSAPublicKey toRSAPublicKey (String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] decoded = Base64.getDecoder().decode(publicKey);
        return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
    }

    public static RSAPrivateKey toRSAPrivateKey (String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] decoded = Base64.getDecoder().decode(privateKey);
        return  (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
    }

    /**
     * RSA公钥加密
     *
     * @param str    加密字符串
     * @param publicKey 公钥
     * @return 密文
     * @throws Exception 加密过程中的异常信息
     */
    public static String encrypt(String str, String publicKey) throws Exception {
        //base64编码的公钥
        byte[] decoded = Base64.getDecoder().decode(publicKey);
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        //RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));
        return outStr;
    }

    /**
     * RSA私钥解密
     *
     * @param str    加密字符串
     * @param privateKey 私钥
     * @return 明文
     * @throws Exception 解密过程中的异常信息
     */
    public static String decrypt(String str, String privateKey) throws Exception {
        //64位解码加密后的字符串
        byte[] inputByte = Base64.getDecoder().decode(str);
        //base64编码的私钥
        byte[] decoded = Base64.getDecoder().decode(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        //RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }

}

示例

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.example.demo.util.RSAUtils;
import org.junit.jupiter.api.Test;

import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;

public class JWTTest {

    String[] keys;

    {
        try {
            keys = RSAUtils.genKeyPair(1024);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test() {
        try {
            System.out.println(Arrays.toString(keys));
            Algorithm algorithm = Algorithm.RSA256(
                    RSAUtils.toRSAPublicKey(keys[0]),
                    RSAUtils.toRSAPrivateKey(keys[1]));
            String token = JWT.create()
                    .withIssuer("auth0")
                    .withExpiresAt(Instant.now().plus(1, ChronoUnit.DAYS))
                    .sign(algorithm);
            System.out.println(token);
            decodedJWT(algorithm, token);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    private void decodedJWT(Algorithm algorithm, String token) {
        DecodedJWT decodedJWT;
        try {
            JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer("auth0")
                    .build();
            decodedJWT = verifier.verify(token);
            System.out.println(decodedJWT.getPayload());
        } catch (Exception e){
            e.printStackTrace();
        }
    }

}

 

标签:java,String,示例,jwt,RSA,import,security,public
From: https://www.cnblogs.com/math-and-it/p/17445231.html

相关文章

  • Java中泛型详解,非常详细
    前言在前面的几篇文章中,详细地给大家介绍了Java里的集合。但在介绍集合时,我们涉及到了泛型的概念却并没有详细学习,所以今天我们要花点时间给大家专门讲解什么是泛型、泛型的作用、用法、特点等内容。有些粉丝朋友,在之前就一直很好奇,比如List<String>中的<String>部分到底......
  • java实现泛型加法
    之前实践中实现数据的加法,很繁琐,比如下面,每一种类型都要写一遍,能不能用泛型方法实现呢?publicLonggetSum(Long...args){longinit=0L;for(Longarg:args){if(arg==null){arg=0L;}ini......
  • java 对象字段名转化——@SerializedName
    有时调用第三方接口返回的字段名和我们接收对象字段名不一致或不规范,可以使用@SerializedName这个注解进行转换;直接上代码:@DatapublicclassxxxVo{//将别名product_name转为productName@SerializedName("product_name")privateStringproductName;......
  • java中线程的启动方式
     1.继承Thread类重写run方法publicclassTreadTest01extendsThread{@SneakyThrows@Overridepublicvoidrun(){for(inti=0;i<100;i++){Thread.sleep(100);System.out.println(Thread.currentThread().getNam......
  • java中线程的状态
    一:从操作系统上说可以分为5种 新建:线程被创建出来时就绪:此时cpu拥有可执行权,但是未被真正执行运行中:线程正在执行等待:被阻塞了(sleepwait方法等)结束:整个线程结束二:从java源码中分为6种状态从Thread源码中我们可以看到一个枚举类:JAVA给出了以下6种状态NEW  ......
  • Java中如何中断线程
    在Java中,可以使用以下方法中断线程:1.使用`interrupt()`方法:每个线程对象都有一个`interrupt()`方法,用于中断该线程。当调用线程的`interrupt()`方法时,它会设置线程的中断状态为"中断",但并不会立即停止线程的执行。线程在执行过程中可以通过检查中断状态来决定是否终止执行。2.......
  • Java并发(七)----线程sleep、yield、线程优先级
    1、sleep与yieldsleep调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException睡眠结束后的线程未必会立刻得到执行建议用TimeUnit的sleep代替Thread......
  • 即时设计—小组项目原型示例(附AI功能)
    (官网:js.design)即时设计——可云端编辑的专业级设计工具更简单高级的功能,支持多人实时协作,颠覆传统软件的设计形态。特点简介:即时设计是中国版的Figma,适用于团队合作和远程协作。它具有强大的实时协作功能,多人可以同时编辑和评论设计文件。它还具有内置的原型设计功能,可以创......
  • 基于JAVA的springboot+vue学生综合测评系统,附源码+数据库+论文+PPT
    1、项目介绍本学生综合测评系统以springboot作为框架,b/s模式以及MySql作为后台运行的数据库,同时使用Tomcat用为系统的服务器。本系统主要包括首页,个人中心,学生管理,试题信息管理,测评试题管理,管理员管理,综合测评管理,系统管理,综合考试管理等功能,通过这些功能的实现基本能够满足日常......
  • drf-JWT认证
    目录一jwt介绍和原理1.1cookie,session,token发展历史1.2认证过程1.3JWT的构成1.3.1header1.3.2payload1.3.3signature二base64编码和解码2.1base64使用2.2base64的用途三jwt开发流程四drf-jwt快速使用五drf-jwt定制返回格式六自定义签发和认证6.1drf-jwt自定义用户......