JWT加密规则

JWT加密规则


JWT(Java Web Token)是基于token的身份认证的方案,可以保证安全传输的前提下传送一些基本的信息,JWT的安全特性保证了token的不可伪造和不可篡改。本质上是一个独立的身份验证令牌,可以包含用户标识、用户角色和权限等信息,以及您可以存储任何其他信息(自包含)。任何人都可以轻松读取和解析,并使用密钥来验证真实性。JWT包含如下三部分:

  1. 头部(header): {“alg”:“HS256”} , 使用base64编码
  2. 载荷(playload): {“jti”:“18cba4db-3877-4738-b137-5b8ff5a53727”,“iat”:1608180072,“sub”:“{“code”:“工号”}”,“exp”:1608180132}, 使用base64编码
    Jti: JWT的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
    Iat: JWT的签发时间
    Sub: JWT所面向的用户
    Exp: JWT的过期时间,这个过期时间必须要大于签发时间
  3. 签证(signature): base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过头部声明的HS256加密方式进行检验secret组合加密将这三部分用“.”连接成一个完整的字符串,构成了最终的JWT

示例
1.生成一个token:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI1ZjkwNTBhYS1iYzA4LTRmMjUtOGUyNi05YzU1Mjc2MmYzY2IiLCJpYXQiOjE2MDgyNTgzMzUsInN1YiI6IntcImNvZGVcIjpcIjAwMVwifSIsImV4cCI6MTYwODI1ODQzNX0.N3tOp24jKKTrQk4YJUb4BLsYqd1Rs9Lha99J7fJ_uoA
头部为:eyJhbGciOiJIUzI1NiJ9
释:头部由{“alg”:“HS256”}使用Base64加密得来
荷载为:eyJqdGkiOiI1ZjkwNTBhYS1iYzA4LTRmMjUtOGUyNi05YzU1Mjc2MmYzY2IiLCJpYXQiOjE2MDgyNTgzMzUsInN1YiI6IntcImNvZGVcIjpcIjAwMVwifSIsImV4cCI6MTYwODI1ODQzNX0
释:荷载由{“jti”:“5f9050aa-bc08-4f25-8e26-9c552762f3cb”,“iat”:1608258335,“sub”:“{“code”:“001”}”,“exp”:1608258435}使用Base64加密得来
签证为:N3tOp24jKKTrQk4YJUb4BLsYqd1Rs9Lha99J7fJ_uoA
加密密钥为:jdsaklREKJNS231NKLS
释:签证使用头部与荷载配合加密密钥
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI1ZjkwNTBhYS1iYzA4LTRmMjUtOGUyNi05YzU1Mjc2MmYzY2IiLCJpYXQiOjE2MDgyNTgzMzUsInN1YiI6IntcImNvZGVcIjpcIjAwMVwifSIsImV4cCI6MTYwODI1ODQzNX0通过配合加密密钥使用HS256加密方式进行检验加密。
JAVA代码(JWT加密)
下面展示一些 内联代码片

<dependency>
   <groupId>io.jsonwebtoken</groupId>
   <artifactId>jJWT</artifactId>
   <version>0.7.0</version>
</dependency>

<dependency>
   <groupId>com.auth0</groupId>
   <artifactId>java-JWT</artifactId>
   <version>2.2.0</version>
</dependency>

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.10</version>
</dependency>
package com.gloudtek.service;

import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.*;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.UUID;

public class JTWEncryption {
    // 加密密钥
    static String SECRETKEY = "csdnyyds";

    // 由字符串生成加密key
    public static SecretKey generalKey(String stringKey) {
        byte[] encodedKey = Base64.decodeBase64(stringKey);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    /**
     * 创建JWT
     * @param uuid  唯一id
     * @param subject  json形式字符串或字符串,可存用户工号,不可存储敏感信息,例如:密码,与token解析后进行对比,防止乱用
     * @param expirationDate  生成JWT的有效期,单位秒
     * @return
     * @throws Exception
     */
    public static String createJWT(String uuid, String subject, long expirationDate) throws Exception {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        SecretKey key = generalKey(SECRETKEY);
        JWTBuilder builder = JWTs.builder().setIssuer("").setId(uuid).setIssuedAt(now).setSubject(subject)
                .signWith(signatureAlgorithm, key);
        if (expirationDate >= 0) {
            long expMillis = nowMillis + expirationDate*1000;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }
        return builder.compact();
    }


    /**
     * 实例演示
     */
    public static void main(String[] args) {
        JSONObject subject = new JSONObject(true);
        subject.put("code", "001"); //工号
        //加密
        try {
            String token = createJWT(UUID.randomUUID().toString(), subject.toJSONString(), 100);//100秒过期
            System.out.println(token);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

版权声明:本文为weixin_44949531原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。