登录科普(四)JWT的使用

JWT的SHA256和RSA256:
本篇采用java-jwt的jar包来实现JWT。主要讲解SHA256和RSA256两种方式,其他的不做讨论。java-jwt是JAVA中最安全的、使用人数最多的jar包。

maven:

<!--JWT-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.3.0</version>
        </dependency>

HS256:

package com.kindo;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.util.Date;

/**
 * Created by lingbao08 on 2018/1/27.
 */
public class TestJWTHS256 {

   private static JWTVerifier verifier = null;

    static {
        Algorithm algorithm;
        try {
            algorithm = Algorithm.HMAC256("secret");
            verifier = JWT.require(algorithm)
                    .withIssuer("auth1")
                    .build();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testCreate() {
        try {
            Algorithm algorithm = Algorithm.HMAC256("secret");
            String token = JWT.create()
                    .withIssuer("auth1")
                    //设置自定义字段
                    .withClaim("privilege","权限1")
                    .sign(algorithm);
            System.out.println(token);
        } catch (UnsupportedEncodingException e){
            e.printStackTrace();
        } catch (JWTCreationException e){
            e.printStackTrace();
        }
    }

    @Test
    public void validateAndDecode(){
        String token =            "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMSIsInByaXZpbGlnZSI6Iuadg-mZkDEifQ.jkwTXIdG39VhzDEqEn090MAciuYYNVCGohwd_qJsH-k";
        try {
            DecodedJWT jwt = verifier.verify(token);
            //从jwt中可以直接获取规定的字段,比如issuser,issUsedAt等字段
            String issuer = jwt.getIssuer();
            //自定义字段的获取
            Claim privilege = jwt.getClaim("privilege");
            //在不设置日期时,日期为null
            Date expiresAt = jwt.getExpiresAt();
            System.out.println(expiresAt);
            System.out.println(issuer);
            System.out.println(privilige.asString());
        } catch (JWTVerificationException e){
            e.printStackTrace();
        }
    }
}

RSA256:
首先需要一个RSA工具:

public class RSAUtil {

    //非对称密钥算法
    public static final String KEY_ALGORITHM="RSA";


    /**
     * 密钥长度,DH算法的默认密钥长度是1024
     * 密钥长度必须是64的倍数,在512到65536位之间
     * */
    private static final int KEY_SIZE=1024;
    //公钥
    public static final String PUBLIC_KEY="RSAPublicKey";

    //私钥
    public static final String PRIVATE_KEY="RSAPrivateKey";

    /**
     * 初始化密钥对
     * @return Map 甲方密钥的Map
     * */
    public static Map<String,Object> initKey() throws Exception{
        //实例化密钥生成器
        KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM);
        //初始化密钥生成器
        keyPairGenerator.initialize(KEY_SIZE);
        //生成密钥对
        KeyPair keyPair=keyPairGenerator.generateKeyPair();
        //甲方公钥
        RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();
        //甲方私钥
        RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();
        //将密钥存储在map中
        Map<String,Object> keyMap=new HashMap<>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;

    }
}

测试RSA256:

@RestController
public class RSAController {
    public static final String ISSUER = "签发人";
    private static Algorithm algorithm;
    private static RSAPublicKey publicKey;
    private static RSAPrivateKey privateKey;
/**
 * 计算密钥
 **/
@RequestMapping("/calculate")
    public void calculate(){

        Map<String, Object> stringObjectMap = null;
        try {
            stringObjectMap = RSACoder.initKey();
        } catch (Exception e) {
            e.printStackTrace();
        }
        publicKey = (RSAPublicKey) stringObjectMap.get(RSACoder
                .PUBLIC_KEY);

        privateKey = (RSAPrivateKey) stringObjectMap.get(RSACoder.PRIVATE_KEY);
        algorithm = Algorithm.RSA256(publicKey, privateKey);
    }
/**
 * 生成JWT
 **/  
@RequestMapping("create")
    public void testCreate() throws Exception {
        try {
            String token = JWT.create()
                    .withIssuer(ISSUER)
                    .sign(algorithm);
            System.out.println(token);
        } catch (JWTCreationException exception) {
            exception.printStackTrace();
        }
    }
/**
 * 校验JWT
 **/
    @RequestMapping("validate")
    public void validateAndDecode(@RequestParam("token") String token) {
        try {
            JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer(ISSUER)
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            String issuer = jwt.getIssuer();
            System.out.println(issuer);
        } catch (JWTVerificationException e) {
            e.printStackTrace();
        }
    }
}

ps:RS256的额外参数参见HS256.

springboot+spring security +io.jwt:参见链接:https://segmentfault.com/a/1190000009231329。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,311评论 19赞 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,448评论 6赞 342
  • 要加“m”说明是MB,否则就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505阅读 5,131评论 0赞 53
  • 0.原生和uiwebview都要分别支持.uiwebview难度系数比较大。 1.pod 'SDWebImage/...
    iOS白水阅读 4,130评论 7赞 1
  • 前天我发日记的时候我看到了,我是第一个发的,我就在想后面的人是不是还会发呀 ,这是我当时的想法,可是到了第二天下午...
    子细阅读 199评论 0赞 0

友情链接更多精彩内容