JWT与Token详解

news/2024/5/5 11:44:28/文章来源:https://blog.csdn.net/m0_46217225/article/details/130063383

前言:JWT全称“JSON Web Token”,是实现Token的机制。官网:https://jwt.io/

JWT的应用

  1. JWT用于登录身份验证。
  2. 用户登录成功后,后端通过JWT机制生成一个token,返回给客户端。
  3. 客户端后续的每次请求都需要携带token,携带在authorization中。
  4. 后端从authorization中拿到token后,通过secretKey进行解密验证身份。

Token的组成原理

JWT生成的Token由三部分组成:header.payload.signature

  • header

    • alg:指定signature采用的加密算法,默认是HS256,对称加密(加密和解密的密钥相同)
    • typ:固定值,通常是JWT
    • 通过base64Url算法进行编码
  • payload

    • 用户id和name
    • 默认携带iat,令牌签发时间(时间戳)
    • exp设置令牌过期时间
    • 通过base64Url算法进行编码
  • signature

    • 设置一个secretKey,通过将前两个结果合并后进行HS256算法
    • HS256(baseUrl64(header)+'.'+baseUrl(payload)+','+secretKey)
    • secreKey一定不能暴露,因为可以颁发token,也可以解密

采用HS256对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

JWT对称加密

JWT默认使用的是HS256对称加密,其中secretKey是密钥,意味着公钥和私钥都是同一个,这样安全性不高。

例如在分布式服务中,其他系统服务器虽然可以用secretKey验证token,但是这样不安全,因为采用的是对称加密算法,每个服务器都可以通secretKey颁发token,黑客只要攻破任何一个服务器就可以拿到secretKey。

在这里插入图片描述

JWT非对称加密

所以我们需要使用非对称加密,加密和解密的密钥不一致。加密密钥称为“私钥”,解密密钥称为“公钥”。
在这里插入图片描述

采用RS256非对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

生成私钥和公钥

mac电脑直接使用终端

windows电脑安装git,使用git bash终端。

  • 输入openssl
  • 输入genrsa -out private.key 2048生成私钥
  • 输入rsa -in private.key -pubout -out public.key生成公钥

代码中加密使用的算法需要修改为RS256非对称加密算法(注意:RS256最小密钥大小为2048位)

nodejs中实现JWT

const Koa = require('koa')
const KoaRouter = require('@koa/router')
const jwt = require('jsonwebtoken');
const fs = require('fs')const app = new Koa();
const loginRouter = new KoaRouter({ prefix: '/login' })
const usersRouter = new KoaRouter({ prefix: '/users' })const privateKey = fs.readFileSync('./keys/private.key')
const publicKey = fs.readFileSync('./keys/public.key')
// login接口
loginRouter.post('/', (ctx, next) => {const payload = { id: 1, name: 'zjc' }const token = jwt.sign(payload, privateKey, {expiresIn: 3000,algorithm: 'RS256'})ctx.body = {message: '登录成功',code: 200,token}
})
// users接口
usersRouter.get('/', (ctx, next) => {const token = ctx.header.authorization.replace('Bearer ', '')console.log(token);try {// 验证tokenjwt.verify(token, publicKey)ctx.body = {code: 200,data: ['xx', 'yy']}} catch (error) {ctx.body = {code: -1001,message: 'token无效'}}})app.use(loginRouter.routes())
app.use(usersRouter.routes())
app.listen(8000, () => {console.log('服务器启动成功');
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_286090.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用加密算法

目录 常见的加密算法可以分成三种: 对称加密算法 DES 3DES AES 非对称加密 RSA ECC Hash算法 MD5 SHA1 算法对比 算法选择 常见的加密算法可以分成三种: 对称加密算法;非对称加密算法;Hash算法;接下来我们…

面试手撕堆排序

堆排序代码如下(注释见下): 首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的堆顶 将堆顶的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n…

Linux设备驱动开发 - 块设备驱动ramdisk实例

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录理论来源源码编译测试理论来源 ramdisk驱动,区别在与使用最新的内核版本,比如linux-4.15。…

MySQL数据库:聚合函数、分组查询、约束、默认值设置、自增属性

一、聚合函数 1.聚合函数 在MySQL数据库中预定义好的一些数据统计函数。 2.count(*) 功能:统计结果条数。 3.sum(字段名) 功能:对指定字段的数据求和。 4.avg(字段名) 功能:对指定字段的数据求平均值。 5.max(字段名) 和 min(字段名) …

答疑——20年国赛题(JAVA解法)

题目链接:用户登录https://www.lanqiao.cn/problems/1025/learning/?page3&first_category_id1&sortstudents_count 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老…

sqoop数据导出、脚本使用

目录 准备表与数据 数据导出 脚本调用 准备表与数据 mysql表 CREATE TABLE user (id int(20),name varchar(20) )ENGINEINNODB DEFAULT CHARSETutf8; hive表 create table users( id bigint, name string ) row format delimited fields terminated by "\t";…

软考初级程序员--学习

1、十进制 转 二进制 十进制87 转换为 二进制为 1010111 2、二进制 转 十进制 二进制1010111 转换为 十进制 3、循环队列 计算长度通用公式: front:表示队首 rear:表示队尾 M:表示队列容量 队列长度 (rear - fr…

Verilog | 二进制与格雷码

一、格雷码简介 格雷码是一个叫弗兰克格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展,如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性,避免过程中出现不必要的错误和漏洞,从而帮助企业更加稳健地自我发展。那么,一…

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复数据库的安全性数据库备份与恢复技术数据备份数据库故障与恢复数据库的安全性 在做信息系统开发的过程当中,数据库是其中很大的占比,信息…

【MySQL入门指南】数据库基本操作

文章目录MySQL库操作一、SQL语句二、创建数据库1.语法2.案例3.极其不推荐的方式三、查看数据库1.语法四、修改数据库五、删除数据库六、字符集与校验规则1.是什么2.相关指令3.校验规则的影响七、备份数据库1.基本语法2.注意事项MySQL库操作 一、SQL语句 DDL(data definition l…

Visual Studio Code跳转到CSS定义

Visual Studio Code 快速跳转到 VUE文件 或 CSS文件的定义位置(跳转到class定义,跳转到css定义),插件Css Peek、Vue Peek 对提升开发效率上,事半功倍。 目录 1、跳转到CSS定义 1.1、CSS Peek 1.2、Vue Peek 2、其他…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题,共50分) 1. 下列说法不正确的是?( ) A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析:针对声音可以进行导入,上传&…

【C++】哈希的应用 -- 布隆过滤器

文章目录一、布隆过滤器的引入二、哈希函数个数的选择三、布隆过滤器的实现四、布隆过滤器的应用五、布隆过滤器总结一、布隆过滤器的引入 我们在上一节中学习了 位图,知道了位图可以用来快速判断某个数据是否在一个集合中,但是位图有如下的缺点&#x…

计网第五章.运输层—TCP的三次握手与四次挥手

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、TCP三次握手建立连接为什么TCP客户进程最后还要发送一个普通的TCP确认报文段呢?能不能两次握手?总结:二、TCP四次挥手释放连接四次挥手过程问题1:TCP客户进程在发送完…

论文阅读 - ANEMONE: Graph Anomaly Detection with Multi-Scale Contrastive Learning

目录 摘要 1 简介 2 问题陈述 3 PROPOSED ANEMONE FRAMEWORK 3.1 多尺度对比学习模型 3.1.1 增强的自我网络生成 3.1.2 补丁级对比网络 3.1.3 上下文级对比网络 3.1.4 联合训练 3.2 统计异常估计器 4 EXPERIMENTS 4.1 Experimental Setup 4.1.1 Datasets 4.1.2 …

HuggingGPT强势来袭,LLM+专家模型,迈向更通用的AI

出品人:Towhee 技术团队 超级组合:HuggingFace ChatGPT HuggingGPT强势来袭。人类仿佛距离真正的AGI又更近了一步。 HuggingGPT是浙江大学与微软亚洲研究院的联手研究,发布之后迅速引发关注,已经开源。 它的使用非常简单&#x…

极氪X上市,18.98万元起售,进军紧凑豪华车市场

HiEV消息(文/Amy)4月12日,纯电SUV极氪X上市,共发布三个版本,官方零售价为: •ME版 五座后驱 189,800元 •YOU版 五座四驱 209,800元 •YOU版 四座后驱 209,800元全系三款车型预计将于6月起开启交付。极氪X限…

分享一个RecyclerView嵌套webview 滑动不流畅的解决方法

因RecyclerView 和webview 或者X5的webview 都具有滑动的功能 所以在做嵌套的时候 会出现滑动不流畅 等问题 解决思路 就是判断滑动的时候 是否自身消耗 或者父布局的RecycleView消耗 开发中还遇到个问题 就是 更换成x5的时候 getScrolly() 返回的一直是0 改成getWebScrollY(…

借助Nacos配置中心实现一个简易的动态线程池

目录 一、实现思路 二、实现说明概览 三、代码实现 DynamicThreadPool RejectedProxyInvocationHandler DynamicThreadPoolRegister DynamicThreadPoolRefresher 测试动态线程池 平常我们系统中定义的一些线程池如果要想修改的话,需要修改配置重启服务才能生…