网关签名公钥-私钥 JWT恶补

news/2024/7/24 8:02:39 标签: 服务器, 网络, 网关签名, spring boot

一、 为什么要用签名?签名到底是什么?

1.1 最近在做一个调用第三方接口的需求,因为在一个请求到达服务器的过程中,通常是要经过很多个中间环节进行转发的(网关、路由、代理),而在任意的一个中间环节中都是可以获取到请求中的数据的。为了保证数据传送过程的安全性,所以用到了签名...

 


1.2 签名具有三大作用: 认证、防止抵赖、防篡改

签名的原理是:私钥加密,公钥解密


1.3 签名算法是指用于计算数字签名的算法。数字签名,就是只有信息的发送者才能产生别人无法伪造的一段数字串,这段数字串同时也是对信息发送者的一个有效证明。计算数字签名通常是个单向的过程(类似于摘要算法的不可逆性)。

其中私钥加密的过程  ----- 又叫 签名算法

公钥解密的过程  -------  又叫  验证算法

二、我此次用到的加密算法是-- HMAC_SHA256

SHA-256(安全散列算法256)是散列函数(或哈希函数)的一种,能对一个任意长度(按bit计算)的数字消息(message),计算出一个32个字节长度的字符串(又称消息摘要,message digest)。

 

三、附赠JWT(JSON Web Token) 恶补

书到用时,方恨少,做需求时,才知道,你都用网关了,你不深入理解一下JWT嘛~~ 嗷嗷

一、jwt 起源:

jwt(JSON Web Token) 主要用于用户登录鉴权

(1)那么最初的认证方式时Session认证,session 认证的缺点其实很明显,由于 session 是保存在服务器里,所以如果分布式部署应用的话,会出现session不能共享的问题,很难扩展。于是乎为了解决 session 共享的问题,又引入了 redis.

(2)后来又引入了tocken 认证,这种方式跟 session 的方式流程差不多,不同的地方在于保存的是一个 token 值到 redis,token 一般是一串随机的字符(比如UUID),,,value 一般是用户ID,并且设置一个过期时间。每次请求服务的时候带上 token 在请求头,后端接收到token 则根据 token 查一下 redis 是否存在,如果存在则表示用户已认证,如果 token 不存在则跳到登录界面让用户重新登录,登录成功后返回一个 token 值给客户端。

优点:是多台服务器都是使用 redis 来存取 token,不存在不共享的问题,所以容易扩展。

缺点:是每次请求都需要查一下redis,会造成 redis 的压力。

jwt的签名算法有三种:

  • HMAC【哈希消息验证码(对称)】:HS256/HS384/HS512

二、jwt 数据结构:

3.1  jwt头(header):JWT头部分是一个描述JWT元数据的JSON对象 ;

3.2  有效载荷(payload):七个默认字段+自定义私有字段;

3.3  签名 (Signature):签名=HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload),secret

三、jwt 理解:

JWT(JSON Web Token)的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改

四、jwt 的安全性:

jwt是存储在客户端的,服务器端不需要存储jwt的,客户端每次发送请求时会携带该token,然后到服务器端会验证token是否正确;

  • JWT的哈希签名(Signature)的密钥是存放在服务端的,所以只要服务器不被攻破,理论上JWT是安全的。因此要保证服务器的安全
  • JWT可以使用暴力穷举来破解,所以为了应对这种破解方式,可以定期更换服务端的哈希签名密钥(相当于盐值)。这样可以保证等破解结果出来了,你的密钥也已经换了

这也是为什么,我做这个调用第三方接口,需要网关签名 + token 的双重验证方式.   

五、jwt.Signature  签名哈希:

签名哈希部分是对上面两部分数据签名header + payload),需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改

注意JWT每部分的作用,在服务端接收到客户端发送过来的JWT token之后:

header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值
 


http://www.niftyadmin.cn/n/5269191.html

相关文章

HarmonyOS后台代理提醒

后台代理提醒 简介 随着生活节奏的加快,我们有时会忘记一些重要的事情或日子,所以提醒功能必不可少。应用可能需要在指定的时刻,向用户发送一些业务提醒通知。例如购物类应用,希望在指定时间点提醒用户有优惠活动。为满足此类业…

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request 错误截图: 在官方网站中,查看常见问题排查: 错误追踪: 跟着源码可以看到如下代码: 从源码中&a…

eNSP小实验---(简单混合)

实验目的&#xff1a;实现vlan10 vlan20 172网段用户互访 1.拓扑图 2.配置 PC1 其它同理 SW4 <Huawei> <Huawei>u t m Info: Current terminal monitor is off. <Huawei>sys <Huawei>sys Enter system view, return user view with CtrlZ. [Hua…

BP神经网络原理,基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪(代码…

如何计算2的n次方

今天在写代码的时候&#xff0c;遇到了纹饰评分的计算&#xff0c;纹饰的等级和评分的关系为&#xff1a; 1级纹饰&#xff1a;202级纹饰&#xff1a;403级纹饰&#xff1a;80 得出纹饰等级grade和纹饰评分score的关系&#xff1a;score (2 ^ grade) * 10&#xff0c;所以就…

哈希扩展:位图与布隆过滤器

目录 1. 位图1.1 位图引入1.2 位图概念1.3 位图的模拟实现1.4 位图相关问题1.5 位图的应用 2. 布隆过滤器2.1 布隆过滤器概念2.2 模拟实现2.3 布隆过滤器相关问题2.3.1 哈希切分 1. 位图 1.1 位图引入 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&…

LeetCode:2276. 统计区间中的整数数目(TreeMap Java)

目录 2276. 统计区间中的整数数目 题目描述&#xff1a; 实现代码与解析&#xff1a; TreeMap 原理思路&#xff1a; 2276. 统计区间中的整数数目 题目描述&#xff1a; 给你区间的 空 集&#xff0c;请你设计并实现满足要求的数据结构&#xff1a; 新增&#xff1a;添加…

分发饼干(贪心算法)

假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有一个尺寸 s[j]…