242期如何保证token的安全性

2021-07-05 12:18 Java最全面试题库

图片

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

Token授权机制:

用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证。

时间戳超时机制:

用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。

签名机制:

将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改。

拒绝重复调用(非必须):

客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)。

流程如下:

  • 客户端通过用户名密码登录服务器并获取Token
  • 客户端生成时间戳timestamp,并将timestamp作为其中一个参数。
  • 客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign
  • 将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://api.com/users?token=asdsadasd&timestamp=123&sign=123123123)
  • 服务端写一个过滤器对token、timestamp和sign进行验证,只有在token有效、timestamp未超时、缓存服务器中不存在sign三种情况同时满足,本次请求才有效

在以上三种机制的保护下,

如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

如果有人使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名或时间戳超时而拒绝服务,所以DOS攻击也是不可能的;

如果签名算法和用户名密码都暴露了,那齐天大圣来了估计也不好使吧...

最后说一句,所有的安全措施都用上的话有时候难免太过复杂,在实际项目中需要根据自身情况作出裁剪,比如可以只使用签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只用Token机制就可以了。如何裁剪,全看项目实际情况和对接口安全性的要求~

来源网络

往期回顾:

图片

2020年百日百更原创Java最全面试题库之往期回顾

【000期】Java最全面试题库思维导图

【020期】JavaSE系列面试题汇总(共18篇)

【028期】JavaWeb系列面试题汇总(共10篇)

【042期】JavaEE系列面试题汇总(共13篇)

【049期】数据库系列面试题汇总(共6篇)

【053期】中间件系列面试题汇总(共3篇)

【065期】数据结构与算法面试题汇总(共11篇)

【076期】分布式面试题汇总(共10篇)

【100期】综合面试题系列汇总(共23篇)

【151期】100-150期汇总(共50篇)

【201期】150-200期汇总(共50篇)

【202期】如何用 Redis 统计独立用户访问量?

【203期】Mybatis是如何运用设计模式的?

【204期】LRU的原理是什么?Redis是如何实现LRU的?

【205期】Feign的工作原理是什么?

【206期】数据库可以部署在容器中吗?为什么?

【207期】为什么SELECT * 效率低?

【208期】如何解决Redis主从集群切换数据丢失问题?

【209期】Java8中Stream对列表去重的方法有哪些?

【210期】Spring的Bean实例化过程是怎样的?

【211期】Tomcat 在 SpringBoot 中是如何启动的?

【212期】 Spring 注解式 AOP 的底层实现原理是什么?

【213期】如何保证缓存和数据库的一致性?

【214期】@Annotation注解的实现原理是什么?

【215期】说说你对 RabbitMQ 的理解以及使用它的场景

【216期】分布式 ID 解决方案有哪些?

【217期】你对MySQL中的索引了解多少?

【218期】SpringBoot中的@Import注解的原理是什么?

【219期】哈希表的原理是什么?

【220期】如何使用Redis实现电商系统的库存扣减?

【221期】一段Java代码是如何执行的?

【222期】为什么Integer用==比较时127相等而128不相等?

【223期】Java遍历Map集合有哪几种方式?各自效率如何?

【224期】try-catch-finally 和 return 的执行顺序是怎样的?

【225期】在不停止程序运行的情况下,如何实现对象(或者类)的动态替换?

【226期】1.3 万亿条数据查询,如何做到毫秒级响应?

【227期】Nacos的实现原理是什么?

【228期】说一下JDK/Dubbo/Spring 三种 SPI 机制?

【229期】ArrayList使用forEach遍历的时候删除元素会报错吗?

【230】熟悉红黑树吗?能不能手写一下?

【231期】JDK 序列化, 碰到serialVersionUID 不一致问题,怎么处理?

【232期】a==1 && a==2 && a==3 是 true 还是 false?

【233期】谈谈 Tomcat 架构及启动过程

【234期】说说Log4j2中RollingFile的文件滚动更新机制

【235期】在设计原则中,为什么反复强调组合要优于继承?

【236期】写时复制(Copy-On-Write)在Java中是如何被应用的?

【237期】说说Java的日志体系及各个组件之间的关系

【238期】线程池是如何重复利用空闲线程的?

【239期】说说Netty 实现长连接服务的难点和优化点

【240期】说说Redis的读写分离技术

【241期】说说你知道的MySQL中的各种锁






“一个专注于分享各类Java面试题的号主,长按二维码关注我吧 ”

祝大家都能拿到心仪的offer!





图片


图片
图片

图片长按识别二维码

等风也等你



文章都看完了图片不点个图片 吗

本文章转载自公众号:tikujie

首页 - Java 相关的更多文章: