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

发布时间:2023年12月17日

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

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实际上代表的是盐值
?

文章来源:https://blog.csdn.net/weixin_45958839/article/details/134972586
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。