深入理解 Token:生成和校验过程详解

2024-03-22 09:36

本文主要是介绍深入理解 Token:生成和校验过程详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题:深入理解 Token:生成和校验过程详解

在网络应用中,Token 是一种常见的身份验证和授权机制,它通过加密技术来确保通信的安全性和用户身份的合法性。在本文中,我们将深入探讨 Token 的生成和校验过程,并提供详细的示例来帮助读者更好地理解。

Token 的生成过程:

1. 选择加密算法和密钥:

首先,我们需要选择合适的加密算法和密钥来生成 Token。常见的算法包括 HMAC 和基于公钥/私钥的算法(如 RSA)等。在示例中,我们选择使用 HMAC-SHA256 算法,并准备好一个密钥。

2. 生成载荷(Payload):

载荷是 Token 中包含的信息,通常包括用户的身份、权限、过期时间等。我们可以用 JSON 格式来表示载荷。示例载荷如下:

{"user_id": "123456","username": "example_user","expires_at": "2024-03-31T00:00:00Z"
}
3. 生成签名(Signature):

使用选定的加密算法和密钥,对载荷进行签名。签名是载荷和密钥的哈希值,用于验证令牌的完整性和真实性。示例中,我们使用 HMAC-SHA256 算法来生成签名。

4. 将载荷和签名组合成令牌:

将生成的签名与载荷组合起来,形成最终的令牌。令牌通常以"."分隔载荷和签名。

Token 的校验过程:

1. 提取载荷和签名:

在接收到令牌后,首先提取载荷和签名。

2. 验证签名:

使用与生成令牌时相同的密钥和加密算法,对载荷进行哈希,并将结果与令牌中的签名进行比较。如果匹配,则令牌未被篡改。

3. 检查有效期:

如果令牌中包含了过期时间,需要验证当前时间是否在有效期范围内。

下面是使用 Java 实现 Token 的生成和校验的示例代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.Base64;public class TokenUtil {private static final String HMAC_ALGORITHM = "HmacSHA256";private static final String SECRET_KEY = "secret_key";// 生成 Tokenpublic static String generateToken(String payload) {try {// 创建 HMAC-SHA256 密钥SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), HMAC_ALGORITHM);Mac mac = Mac.getInstance(HMAC_ALGORITHM);mac.init(secretKeySpec);// 计算签名byte[] signatureBytes = mac.doFinal(payload.getBytes());// 使用 Base64 编码签名String signature = Base64.getEncoder().encodeToString(signatureBytes);// 返回 Token,格式为 payload.signaturereturn payload + "." + signature;} catch (NoSuchAlgorithmException | InvalidKeyException e) {e.printStackTrace();return null;}}// 校验 Tokenpublic static boolean verifyToken(String token) {try {// 提取载荷和签名String[] parts = token.split("\\.");String payload = parts[0];String receivedSignature = parts[1];// 创建 HMAC-SHA256 密钥SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), HMAC_ALGORITHM);Mac mac = Mac.getInstance(HMAC_ALGORITHM);mac.init(secretKeySpec);// 计算签名byte[] calculatedSignatureBytes = mac.doFinal(payload.getBytes());String calculatedSignature = Base64.getEncoder().encodeToString(calculatedSignatureBytes);// 验证签名是否一致if(!receivedSignature.equals(calculatedSignature)){return false;}// 提取过期时间String expirationTime = new String(Base64.getDecoder().decode(payload)).split("\"expires_at\":\"")[1].split("\"")[0];// 检查有效期LocalDateTime expiresAt = LocalDateTime.parse(expirationTime);LocalDateTime currentTime = LocalDateTime.now(ZoneOffset.UTC);return currentTime.isBefore(expiresAt);} catch (NoSuchAlgorithmException | InvalidKeyException e) {e.printStackTrace();return false;}}// 示例public static void main(String[] args) {// 生成载荷String payload = "{\"user_id\": \"123456\", \"username\": \"example_user\", \"expires_at\": \"2024-03-31T00:00:00Z\"}";// 生成 TokenString token = generateToken(payload);System.out.println("Generated Token: " + token);// 校验 Tokenboolean isValid = verifyToken(token);System.out.println("Token is valid: " + isValid);}
}

这个示例演示了如何使用 Java 实现 Token 的生成和校验过程。在生成 Token 时,我们使用 HMAC-SHA256 算法对载荷进行签名,并将签名与载荷一起编码为 Token。在校验 Token 时,我们提取载荷和签名,然后重新计算签名并与接收到的签名进行比较,以验证 Token 的完整性和真实性。

结论:

通过以上示例,我们深入了解了 Token 的生成和校验过程。Token 的安全性取决于密钥的安全性和算法的选择,同时在校验过程中需要注意有效期的检查。合理使用 Token 可以有效保护用户身份和通信的安全性,在网络应用中起着重要作用。

这篇关于深入理解 Token:生成和校验过程详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835044

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n