【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附源码】

2023-11-07

Token令牌-生成工具  包括: 头部(header)+载荷(payload)+签证(signature)

先看效果:

可以自定义加密盐:

主要代码:TokenUtil.java

package com.lgq.common.Util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lgq.common.entity.HeaderTokenEntity;
import com.lgq.common.entity.PlayloadTokenEntity;

import java.util.HashMap;
import java.util.Map;

/**
 * Token令牌-生成工具
 * 头部(header)+载荷(payload)+签证(signature)
 */

public class TokenUtil {

    //Logger logger = LoggerFactory.getLogger(TokenUtil.class);
    /**
     * 自定义加密盐
     */
    public static final String TokenSelf_SaltKey = "Ldeks./,'[]-=&^&Hjkdyye";//实际上配置在application配置文件中,这里动态获取。不打包在jar里,此盐为测试数据。

    public static final String Token_TYP = "JWT";
    public static final String Token_ALG = "AES";
    /**
     * 过期时间(毫米), 3小时后过期
     */
    public static final String Token_EXP = "10800000";
    /**
     * 签发人
     */
    public static final String Token_ISS = "www.liuguiqing.com";

    /**
     * 生成token令牌
     *
     * @param udata 用户登录数据
     * @return string
     * @throws Exception
     */
    public static String getTokenStr(Map udata) throws Exception {
        PlayloadTokenEntity userDataP = new PlayloadTokenEntity();
        userDataP.setUserData(udata);
        String udp = getJWT(userDataP);
        return udp;
    }

    /**
     * header生成jwt(header加入信息转json再Base64加密)
     *
     * @return
     * @throws Exception
     */
    private static String HeaderTokenToBase64() throws Exception {
        HeaderTokenEntity headerTE = new HeaderTokenEntity();
        headerTE.setTyp(Token_TYP);
        headerTE.setAlg(Token_ALG);
        String header_Json = JSON.toJSONString(headerTE);
        String headerToBase64 = Base64Util.encryptBASE64(header_Json.getBytes());
        return headerToBase64;
    }

    /**
     * payload生成jwt
     * 1、payload添加信息(不含用户信息)。
     * 2、转json。
     * 3、Base64加密。
     *
     * @param playload
     * @return
     */
    private static String PayloadTokenToBase64(PlayloadTokenEntity playload) {
        playload.setIss(Token_ISS);
        playload.setExp(Token_EXP);
        playload.setIat(String.valueOf(System.currentTimeMillis()));
        //用户信息置空:
        playload.setUserData(new HashMap());
        String playload_Json = JSON.toJSONString(playload);
        String playloadToBase64 = Base64Util.encryptBASE64(playload_Json.getBytes());
        return playloadToBase64;
    }

    /**
     * 生成JWT Token串
     * 1、Header、Payload基础数据base64加密
     * 2、用户信息base64加密后再AES加盐&&加密
     * 3、返回三者加 . 的token串。
     *
     * @return
     */
    public static String getJWT(PlayloadTokenEntity tokenPlayload) throws Exception {
        try {
            //logger.info("-----------------token start-----------------");
            String userStr = JSON.toJSONString(tokenPlayload);
            //logger.info("getJWT-userStr: "+userStr);

            //获取Header、Payload的Base64加密后的数据:
            String HeaderBase64 = HeaderTokenToBase64();
            String PayloadBase64 = PayloadTokenToBase64(tokenPlayload);//不含用户信息
            //基本数据中间加 ‘.’
            StringBuilder dotSB = new StringBuilder();
            dotSB.append(HeaderBase64);
            dotSB.append(".");
            dotSB.append(PayloadBase64);
            dotSB.append(".");

            //用户数据AES加盐加密:
            String signature = Base64Util.encryptBASE64(AesUtil.encryptAES(userStr, TokenSelf_SaltKey).getBytes());
            dotSB.append(signature);
            //去掉换行:
            String token = StringUtil.getStrToARow(dotSB.toString());
            //logger.info("-----------------token end-----------------");
            return token;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 验证token加密串合法性
     *
     * @param token 加密串
     * @return
     */
    public static boolean TokenTF(String token) {
        if (token.indexOf(".") > -1 && token.split("\\.").length == 3) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 校验token
     *
     * @param tokenstr token加密串
     * @return 用户校验信息
     */
    public static JSONObject tokenCheck(String tokenstr, Map udata) {
        JSONObject jsonObj = new JSONObject();
        try {
            if (TokenTF(tokenstr)) {
                String[] tokens = tokenstr.split("\\.");
                String tokenPayload = new String(Base64Util.decryptBASE64(tokens[1]));
                String tokenUser = new String(Base64Util.decryptBASE64(tokens[2]));
                String userInfo = AesUtil.decryptAES(tokenUser, TokenSelf_SaltKey);
                jsonObj=UserUtil.userInfoCheck(tokenPayload,userInfo,udata);
            }else{
                jsonObj.put("token","false");
                jsonObj.put("code","500");
                jsonObj.put("msg","用户信息不存在!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObj;
    }


    public static boolean tokenCheck(JSONObject json) {
        if (JsonUtil.isNotEmpty(json, "token")) {
            return json.getString("token").equals("true");
        } else {
            return false;
        }
    }


}

源码地址:生成Token 附【带源码】

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附源码】 的相关文章

  • Firebase 3.x - 令牌/会话过期

    有谁知道令牌需要多长时间才会过期 现在没有选项可以在控制台上设置令牌有效性 自 2016 年 5 月起 Firebase 身份验证登录会话不再过期 相反 他们使用长期帐户令牌和短期自动刷新访问 ID 令牌的组合来获得两全其美的效果 如果你想
  • 通过 Microsoft Graph 访问 Workbook 对象所需的正确权限

    我正在尝试从 Sharepoint 文档库中的文件获取 Workbook 对象 根据微软 https learn microsoft com en us graph api resources excel view graph rest 1
  • 如何保护 REST-API 的安全?

    我已经设置了一个带有身份验证的 API 但我只想允许某些应用程序和网站访问它 我该怎么办 我已经为登录的用户设置了身份验证 只能访问 API 但是 如何防止他们从任何地方登录 在回答您的问题之前 我认为重要的是 首先我们要澄清开发人员之间的
  • Rails 简单形式给出 InvalidAuthenticityToken 错误

    我有一个像这样的简单表格
  • 如何按照 PKCS#11 将 Microsoft Crypto API 与 USB 适配器一起使用

    我有一家公司提供的 safenet 身份验证 USB 令牌 他们告诉我他们里面有数字公钥证书 他们给了我一个密码和一个软件 通过它我可以看到它可以检测里面的证书 现在我需要访问此令牌的证书 然后我需要使用我的开发代码进行签名 加密和解密 但
  • Twitter API - “令牌无效或过期”的原因

    导致令牌过期的可能原因是什么 除了用户取消对应用程序的授权之外 我的问题是 我有一个拥有数千名用户的应用程序 所有 API 通信都运行良好 但对于某些用户来说 我得到了invalid or expired token错误 我最初的想法是他们
  • Windows Batch 读取文件并将行解析为标记和变量

    通过搜索这个网站并学习 Windows 批处理脚本这一荒谬的语言 我已经取得了很大的进展 但我现在陷入了困境 我有一个行数可变的文本文件 每行看起来像 AA8315 United States N777AN American Airline
  • Rails in_place_edit:如何传递真实性令牌?

    我正在尝试进行适当的编辑工作 但遇到了此错误 ActionController InvalidAuthenticityToken ActionController InvalidAuthenticityToken 我知道 Rails 现在想
  • 使用 Firebase-PHP 验证 Firebase ID 令牌

    我正在使用 Firebase Auth 在以 PHP 编码的网络应用程序上授权用户 授权本身是用 Javascript 进行的 它在 Ajax 请求上执行以验证用户是否已登录 要在我已经实现的服务器上使用 Firebase AdminFir
  • Azure Cosmos 分页:FeedResponse.ContinuationToken 在下一个请求中不起作用

    下面是我在 Azure Cosmos 中进行分页的代码 在该函数中 我返回 FeedResponse 的 ContinuationToken 获取第一页的第一个请求很好 它返回继续令牌 但是 如果我在下一个请求中使用该令牌 则 API 将返
  • ANTLR4:隐式或显式标记定义

    在 ANTLR4 中使用显式标记定义有哪些优点和缺点 我发现单括号中的文本比创建单独的标记并使用它代替文本更具描述性且更易于使用 E g grammar SimpleTest top library module library libra
  • 推送通知设备令牌?

    如何从我的 iPhone 设备获取设备令牌 此方法将在调试模式下在控制台中打印 deviceToken 如果您想查看设备令牌 也可以在 UIAlert 中看到 void application UIApplication applicati
  • Angular 2/4 存储令牌的位置

    我有一个用于生成令牌的 REST API 我在 Angular 4 客户端中使用它 但问题是在哪里存储该令牌 在互联网上我发现我可以存储在本地存储或cookie中 所以我的问题是 如果存储令牌是本地存储 并且我刚刚从另一个浏览器复制了有效令
  • 将 Dwolla 与 PHP 及其 API 集成

    前言 好吧 我过去使用过 API 例如 TwitterAPI 但我总是使用库和一些文档来帮助我进行连接和检索令牌 我对 API 的工作原理有了基本的了解 好的 我尝试了多种使用 PHP 请求 dwolla API 的方法 我尝试过制作一个
  • 在 Angular 4 中处理来自 Api 的过期令牌

    我需要帮助来处理我的角度应用程序中的过期令牌 我的 api 已过期 但我的问题是当我忘记注销我的角度应用程序时 一段时间后 我仍然可以访问主页但没有数据 我能做点什么吗 有没有可以处理这个问题的库 或者有什么我可以安装的吗 更好 如果我什么
  • Keycloak-js updateToken(minValidity) 需要澄清

    我在Keycloak js中阅读了很多该方法的示例 但没有对以下方法进行明确的解释 updateToken minValidity number KeycloakPromise
  • 无法从 Facebook 获取访问令牌。收到 OAuthException 提示“验证验证码时出错”

    我正在使用 java 我的演示应用程序的目的很简单 更新用户状态 我跟着服务器端流程在页面上http developers facebook com docs authentication http developers facebook
  • 如何在我的应用程序中取消授权/撤销 LinkedIn 令牌

    我有一个 grails 应用程序 我希望用户授予我访问他 她的 LinkedIn 帐户的权限 以获取信息并以不同的方式显示信息 我能够执行以下操作 获取授权码 使用该授权码获取访问令牌 我将该访问令牌与到期日期一起存储在我的用户实体中 当过
  • Swift 客户端和根 SSL 证书身份验证

    积分得到token api of QLIK server with ssl证书 但执行任务后我收到这样的错误 完成时出现错误 代码 999 Your hostname and endpoint let hostname YOUR HOST
  • 使用以太坊 RPC 获取代币余额?

    如何通过以太坊RPC显示代币余额 id 0 data array data jsonrpc 2 0 data id id data method eth call data params from gt 0x0 to gt 0x0 data

随机推荐

  • Google Play 上架总结(二)Google账户关联详解

    近期 本人在 App 上架Google Play 过程中 频繁遇到账号被关联封禁 在踩过很多坑后 我觉得有必要总结一下 给其它朋友作为参考 一 Google 账户关联是指什么 账户关联是就是当Google开发者账号因为各种原因被封停了 此时
  • 从哈佛1000多页的课程名单里,我看到了何谓“大学”

    从哈佛1000多页的课程名单里 我看到了何谓 大学 2017 02 24 22 11 39 来源 齐鲁壹点 山东 举报 分享到 易信 微信 QQ空间 微博 原标题 从哈佛1000多页的课程名单里 我看到了何谓 大学 我相信 大学精神的本质
  • CUDA计算直方图(一)原子操作 atomicAdd

    参考 Shane Cook CUDA Programming A developer s guide to parallel computing with GPUs 目录 背景 使用CPU计算 使用CUDA 原子操作atomicAdd 背景
  • Centos7.9安装python的miniconda环境和配置conda镜像源

    1 Centos7 9安装miniconda Miniconda是一个 免费的 轻量级的 conda安装程序 conda是一个开源的包 环境管理器 能在同一个机器上安装不同Python版本的软件包及其依赖 以及在不同Python环境之间切换
  • win10中安装mysql5.7

    一 mysql5 7网盘下载 win32位win64位都可以用 链接 https pan baidu com s 1j3b1 jMu0FqFt1EZi9SqsQ 提取码 4dsk 二 解压 解压mysql 5 7 34 win32 zip文
  • matlab计算纹波电压,Zeta电路的参数计算及仿真

    Zeta电路的参数计算较为简单 可以用matlab来完成 代码如下 clear clc Vin 12 输入电压单位V Vout 18 输出电压单位V Fs 5000000 开关频率单位Hz Iout 1 输出电流单位A DeltaIin 0
  • 面试频率最高的JAVA问题

    请说说接口和抽象类的区别 估计90 的人都答不好 我的答案是 1 从使用目的来看 接口只是一个类间的协议 它并没有规定怎么去实现 抽象类可以重用你代码使你的代码更加简洁 2 从行为来看 接口可以多继承 multi implement 抽象类
  • 太晚睡觉等于自杀(献给年轻人)

    沉重的话题 一个97级的名校高才生 毕业后进入微软工作 上月死了 只不过25岁的黄金年龄 珍视自己的生命吧 大家 对自己好一点 对了 又听到一个悲伤的消息 广告界的好青年 又挂了一人了 此人是联旭的 是业务还是设计我也搞不清楚 前几天在连续
  • 类对象与初始化列表

    在类中定义的数据成员一般都是基本的数据类型 但是类中的成员也可以是对象 叫做对象成员 C 中对对象的初始化是非常重要的操作 当创建一个对象的时候 c 编译器必须确保调用了所有子对象的构造函数 如果所有的子对象有默认构造函数 编译器可以自动调
  • Linux systemd

    这里写目录标题 一 配置文件内容 二 配置文件位置 三 开机启动配置 四 systemctl使用 一 配置文件内容 systemd服务配置文件存放在 usr lib systemd目录下 有系统system和用户user之分 需要开机不登录
  • 自建XSS平台与BUUCTF[GWCTF 2019]mypassword

    自建XSS平台与BUUCTF GWCTF 2019 mypassword 1 需要用到的工具 BlueLotus XSSReceiver XSS数据接收平台firesunCN BlueLotus XSSReceiver github com
  • C++学习之模板特例化

    模板是C 中一个很重要的特性 写一份代码能用于多种数据类型 包括用户自定义类型 例如 STL的sort 函数可以用于多种数据类型的排序 类stack可以用作多种数据类型的栈 但是 如果我们想对特定的数据类型执行不同的代码 而不是通用模板 呢
  • 第二章 ZAB协议介绍

    第二章 ZAB协议介绍 ZAB ZooKeeper Atomic Broadcast ZooKeeper 原子消息广播协议 是zookeeper数据一致性的核心算法 ZAB 协议并不像 Paxos 算法那样 是一种通用的分布式一致性算法 它
  • https是如何保住信息安全的?

    https采用的是非对称加密以及对称加密混合的加密方式加密来保证用户安全的 他比http协议多了一层加密层 SSL TSL 要详细说明这个 我们要从不加密开始说起 如果不加密的话 浏览器和服务器的交流 很容易就会被第三方拦截 然后信息被偷看
  • iphone降级_iPhone完美降级已实现,checkm8实现降级iOS10.3.3

    前段时间苹果的A5 A11设备被爆出巨大硬件级漏洞 由一位信息安全人员axi0mX 在社交软件上分享了出来 原文翻译过来checkm8 漏洞是一个针对苹果历代产品不可修复的bootrom 嵌入处理器芯片内的一小块掩模ROM或写保护闪存 虽然
  • Yaoo Messenger For Vista发布了

    Yaoo Messenger For Vista发布了 下载地址 http messenger yahoo com download vista php 转载于 https www cnblogs com tangpepper archiv
  • 用 Go 语言实现视频处理服务:从 Java 到 Go 的完整指南

    本文将详细介绍如何使用 Go 语言开发视频处理服务 包括视频转码和拼接功能 我们将首先简要介绍 Go 语言的基本概念 然后通过对比 Java 和 Go 代码 详细介绍如何实现视频转码和拼接功能 并提供相应的代码示例 本教程旨在帮助 Java
  • springboot调用外部接口

    方式一 使用原始httpClient请求 description get方式获取入参 插入数据并发起流程 author lyx date 2022 8 24 16 05 params documentId return String Req
  • uos命令_研华IO卡之统信UOS+龙芯平台下的驱动丢失解决办法

    真是活久见了 在UOS 龙芯3A4000平台下安装好的驱动重启后居然不见了 经过两天的努力 总算把这个问题解决了 其实解决的思路很简单 就是在系统启动后自动执行安装脚本 但是问题总是层出不穷 常规标准的做法 比如在 etc profile
  • 【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附源码】

    Token令牌 生成工具 包括 头部 header 载荷 payload 签证 signature 先看效果 可以自定义加密盐 主要代码 TokenUtil java package com lgq common Util import c