一、概述
大家都对Token和签名耳熟能详,但是为什么在进行安全校验的时候要使用TOKEN+签名认证的方式?单独使用TOKEN或者单独使用签名认证不行吗?
二、Token
背景介绍:
在网站、app与服务器交互的过程中,很多时候需要:
1、标示客户端的请求是否合法,是否已经登录;
2、避免用户多次输入密码,实现自动登陆;
3、避免在终端直接存储用户的密码。
Token验证流程:
基于以上需求,我们就引入了token机制,Token的验证流程通常如下:
1、客户端通过用户名、密码请求登录;
2、服务端接收到客户端请求后,对用户名与密码进行验证;
3、验证成功后,服务端会签发一个 Token,这个Token是与用户名一一对应的,Token一般可以存储在缓存(Redis)或数据库中,以方便后面查询出来进行验证。再把这个 Token 发送给客户端
//如下表示将token保存一个月
redisTemplateUtil.setExpire(RedisPrefixConstants.ADMIN_LOGIN_USERKEY + userKey, userToken +"**",30 *24 *3600);
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据;
7、Token存在过期时间,在Token生成的时候可以打上一个时间戳,验证token的同时验证是否过期,并告知终端。终端接收到token过期的返回后,则要求用户重新输入用户名跟密码,进行登录;
8、用户的一些操作需要从新请求服务端下发token,如退出、修改密码后重新登录。
三、签名
背景介绍:
在客户端与服务器进行交互时,报文虽然加密了,但是我们并不能确认这个报文是谁发过来的,可能能被恶意攻击传入过来的,因此需要验数据来源。例如,与第三方服务器B进行交互时,我方收到了一个已加密的请求,但我方并不能确认是服务器B发送的这个报文,此时我们可以用数字签名的方式来进行验证。
签名的作用
通过以上背景描述可以得知签名可以认证数据来源,此外签名还有如下两个作用
抗否认性:如果我方收到一个B服务器签名的请求,那么B服务器也无法否认这个请求,因为带有它的签名。
保证了数据的完整性:我方收到一个B服务器签名的请求,但我方并不能确认这个请求是否被篡改过(虽然报文加了密,也可能被篡改),此时即可用签名,验证签名中的报文与传过来的报文是否一致。
签名算法
RSA
附:
Token是如何生成的?
以某种方式比如随机生成32位的字符串作为token,核心代码如下。
UUID.randomUUID().toString().replaceAll("-","");
签名是如何生成的?
userKey,UserToken,TimeStamp按照一定的规则通过MD5或者其他方式加密得到。
网友评论