一、 为什么要用签名?签名到底是什么?
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的签名算法有三种:
二、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是否正确;
这也是为什么,我做这个调用第三方接口,需要网关签名 + token 的双重验证方式.???
五、jwt.Signature? 签名哈希:
签名哈希部分是对上面两部分数据签名(header?+ payload),需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
¥signature
由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改
注意JWT每部分的作用,在服务端接收到客户端发送过来的JWT token之后: header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据 |