【Java】登录模块优化 jwt原理以及使用

上手第一步先整个登录模块,找资料做个优化,感觉找来博客写的很杂乱,原理写的非常冗长,完了用法说的的不清不楚的。自己总结一下,也顺便巩固。
兄弟萌,如果感觉写得好的话,给个赞再叉呗~~

参考:
https://blog.csdn.net/weixin_46073538/article/details/128641746
https://www.cnblogs.com/kirito-c/p/12402066.html
https://blog.csdn.net/u014553029/article/details/112759382

登录情况分析

以往登录是为了验证身份,完了之后享受服务。但这样的话,只会在一开始验证一下,之后就不会进行验证了。这显然有问题。如果直接绕过登录模块,那么后续依旧可以享受服务。

第一个解决方案,次次享受服务都要验证登录。这显然很蠢。

所以,这时候就有了“token”解决方案。也就是在服务端生成一个token,在后续客户端想要享受服务,都需要携带这个token来证明我的身份。

这样的好处是,我后面都不需要验证身份,只用这个token来代表我的身份。

但这样衍生出了新的问题:我怎么保护这个token?。因为现在这个token就是代表了我的身份,如果token一旦泄露,相当于别人知道了我的账号密码,可以享受服务。

对称加密与非对称加密

密码学中对称加密:加密算法是公开的,靠的是秘钥来加密数据,使用一个秘钥加密,必须使用相同的秘钥才解密。
非对称加密:加密和解密使用不同的秘钥,一把公开的公钥,一把私有的私钥。公钥加密的信息只有私钥才能解密,私钥加密的信息只有公钥才能解密。

e.g. RSA(非对称)

套入具体环境,所有客户端都作为加密方,服务端作为解密方,那么一个客户端针对密码加密,就只能让服务端解密,其余任何客户端都无法解密。
而实现方式一般是公私密钥。
使用公钥进行加密,只能用私钥进行解密,使用私钥加密,只能使用公钥解密。
所以一般传输密码时候,密码使用公钥加密,传到服务器进行解密。

JWT

上面说到最重要的就是这个token,JWT就是用来生成这个token的。

首先说一下JWT最终生成的token结构:

  1. Header:存储的是关于这个JWT token的元数据信息。可以简单认为就是一个config信息。里面最重要的就是存储签名所使用的编码格式

  2. 载荷:是一个JSON对象,里面存一些有效信息,可以自己定义。但是不能存储重要信息

  3. 签名:这个是最重要的,目前先认为他是一个简单的hash结果先。

整个过程是:

  1. header与载荷部分进行BASE64编码
  2. 然后将header与载荷进行base64编码之后的结果与一个secret进行加密获得签名
  3. 最后将三个部分以点(.)进行连接,也就是最后的token。
  • 首先注意,header与载荷都是简单使用base64编码,这个是任何人都可以解码,目的只是为了更好传传输除了英文字母以外的字符。所以在载荷里面绝对不能加重要的信息
  • 再仔细想,如果我仅有前两个个,随随便便就能够伪造,所以我还需要第三部分签名。所以签名是最重要的,因为他要被难以伪造!但他如何实现难以伪造,就是因为用的加密算法。一般在单服务器环境下使用的是HS256加密,这个是一种对称加密,所以只有获得secret才能解密。

所以jwt中签名是最重要的,而签名之中secret是最重要的。

java实现

实现过程:

  1. 写header
  2. 写载荷
  3. 加密算法+secret构造一下签名就行。

但如果用一下jjwt就简单些,直接构造一下header载荷,完了说明一下加密算法以及密钥就行。

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency>
        long expireTime = System.currentTimeMillis() + 86400000;String token = Jwts.builder()// 设置头部信息header.header().add("typ", "JWT").add("alg", "HS256").and()// 设置自定义负载信息payload.claim("username", username)// 令牌ID//.id(uuid)// 过期日期.expiration(new Date(expireTime))// 签发时间.issuedAt(new Date())// 主题.subject(SUBJECT)// 签发者.issuer(JWT_ISS)// 签名.signWith(Keys.hmacShaKeyFor("secret fill in this place".getBytes()), Jwts.SIG.HS256).compact();

这个写的比较简陋,能用就行嘿嘿,后面再补
最关键的就是加密算法、secret以及时间设置,其他的自己DIY就行。

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

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

相关文章

MFC基础学习应用

MFC基础学习应用 1.基于对话框的使用 左上角为菜单键&#xff08;其下的关于MFC主要功能由IDD_ABOUTBOX决定) 附图 右下角为按钮&#xff08;基本功能由IDD_DIALOG决定,添加按钮使用由左上角的工具箱完成) 附图 2.自行添加功能与按钮//功能代码 void CMFCApplication4Dlg:…

JS基础与高级应用: 性能优化

在现代Web开发中&#xff0c;性能优化已成为前端工程师必须掌握的核心技能之一。本文从URL输入到页面加载完成的全过程出发&#xff0c;深入分析了HTTP协议的演进、域名解析、代码层面性能优化以及编译与渲染的最佳实践。通过节流、防抖、重复请求合并等具体技术手段&#xff0…

linux驱动学习(九)之中断

一、中断的实现 对于中断的请求&#xff0c;在linux内核中&#xff0c;有一套标准的接口函数&#xff0c;可以实现中断的响应和处理。 #include <linux/interrupt.h>//1 申请中断 static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler…

flask南京市旅游景点信息可视化-计算机毕业设计源码02941

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对南京市旅游景点信息可视化等问题&#xff0…

Python笔记 - 运算符重载

在使用NumPy做一些数据处理的时候&#xff0c;发现NumPy的[]运算符其实和普通的python列表是不同的&#xff0c;意识到很可能是numpy做了运算符重载&#xff0c;查阅了一下果然如此。这篇笔记就介绍一下python中如何进行运算符重载. Python重载运算符 在Python中&#xff0c;…

使用gtest做cpp的单元测试并可查看代码覆盖率

前言 由于工作需要&#xff0c;要使用googletest做单元测试&#xff0c;本文记录下搭建gtest单元测试环境&#xff0c;并查看代码覆盖率的方法&#xff0c;以备不时之需。 准备工作 编译gtest 克隆gtest源码&#xff1a; git clone https://github.com/google/googletest.g…

公司面试题总结(三)

13.说说你对 BOM 的理解&#xff0c;常见的 BOM 对象你了解哪些&#xff1f; BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c; ⚫ 提供了独立于内容与浏览器窗口进行交互的对象 ⚫ 其作用就是跟浏览器做一些交互效果 ⚫ 比如如何进行页面的后退&…

VIRT高是因为分配了太多地址空间导致。

一般来说不用太在意VIRT太高&#xff0c;因为你有16EB的空间可以使用。 如果你实在需要控制VIRT的使用&#xff0c;设置环境变量MALLOC_ARENA_MAX&#xff0c;例如: hadoop推荐值为4&#xff0c;因为YARN使用VIRT值监控资源使用。 解决办法就是&#xff1a; export MALLOC_AR…

C语言中的枚举类型(enum)是如何定义的

在C语言中&#xff0c;枚举类型&#xff08;enum&#xff09;是一种用户定义的数据类型&#xff0c;它允许为整数值指定一个易读的名字。枚举类型通常用于表示固定数量的可能值&#xff0c;例如一周的七天或颜色的集合。 枚举类型的定义使用关键字 enum&#xff0c;后面跟着枚…

QUIC 和 TCP: 深入解析为什么 QUIC 更胜一筹

引言 在过去的三十年里&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。 HTTP 协议是一个应用层协议&#xff0c;它基于 TCP&#xff08;传输…

【git使用一】windows下git下载、安装和卸载

目录 &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;安装git &#xff08;3&#xff09;安装验证 &#xff08;4&#xff09;卸载git &#xff08;1&#xff09;下载安装包 官网下载地址&#xff1a;Git 国内镜像下载地址&#xff1a;CNPM Binaries Mir…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

【机器学习】LightGBM: 优化机器学习的高效梯度提升决策树

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 LightGBM: 优化机器学习的高效梯度提升决策树引言一、LightGBM概览二、核心技术…

buildroot编译出错you should not run configure as root

虚拟机版本&#xff1a;ubuntu-22.04.4 问题 buildroot在图形配置后&#xff0c;执行 sudo make开始编译出现以下错误configure: error: you should not run configure as root (set FOenvironment to bypass this check) 在网上看到说在/etc/profile文件中添加以下内容 exp…

火车头采集织梦发布模块插件下载及教程

火车头采集网页数据发布到织梦CMS&#xff08;DeDeCMS&#xff09;系统操作步骤如下&#xff1a; 1. 火车头采集织梦DeDeCMS发布模块下载安装 百度网盘&#xff1a;火车头采集织梦CMS发布插件下载地址 提取码&#xff1a;414h 2. 在火车头采集软件导入织梦De…

MAC系统下安装VUE

下载node.js 点击链接 选择图片中的稳定版本 安装node.js 打开终端&#xff0c;输入 node -v 和 npm -v 显示如上信息表示安装成功 安装vue脚手架&#x1f527; sudo npm install -g vue/cli查看vue版本 vue -V6. 启动项目 1 采用 图形页面方式 控制台输入&#xff…

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?

一. 问题描述 我们在设计表结构的时候&#xff0c;设计规范里面有一条如下规则: 对于可变长度的字段&#xff0c;在满足条件的前提下&#xff0c;尽可能使用较短的变长字段长度。 为什么这么规定&#xff1f;我在网上查了一下&#xff0c;主要基于两个方面 基于存储空间的考…

C# Winform 用户控件,扩展控件,自定义控件综合实例

Control类是Windows窗体控件的基类&#xff0c;它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构&#xff0c;可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件&#xff1a;基本控件的…

IT入门知识博客文章大纲第二部分《编程语言》(2/10)

目录 IT入门知识博客文章大纲第二部分《编程语言》 1.引言 2.编程语言概述 2.1 编程语言的发展历程 2.2 编程范式 3.常见的编程语言 3.1 Python 3.2 Java 3.3 C 3.4 JavaScript 3.5 Ruby 4.编程语言的选择 4.1 技术需求 4.2 团队技能 4.3 社区和生态系统 4.4 可…

Python也能“零延迟“通信吗?ZeroMQ带你开启高速模式!

目录 1、零基础入门ZeroMQ 🚀 1.1 ZeroMQ简介与安装 1.2 基础概念:Socket类型详解 1.3 实战演练:Hello World示例 2、深入浅出消息模式 🔌 2.1 请求-应答模式( REQ/REP ) 2.2 发布-订阅模式( PUB/SUB ) 2.3 推送-拉取模式( PUSH/PULL ) 3、Python实战ZeroM…