管她前浪,还是后浪?
能浪的浪,才是好浪!
每天10:33更新文章,每天掉亿点点头发...
源码精品专栏
原创|Java2021超神之路,很肝~中文详细注释的开源项目RPC框架Dubbo源码解析网络应用框架Netty源码解析消息中间件RocketMQ源码解析数据库中间件Sharding-JDBC和MyCAT源码解析作业调度中间件Elastic-Job源码解析分布式事务中间件TCC-Transaction源码解析Eureka和Hystrix源码解析Java并发源码
前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互。
网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,也可以伪造请求去获取或攻击服务器;也对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。那我们怎么去解决这些问题呢?
接口签名
我们先考虑一下接口数据被伪造,以及接口被重复调用的问题,要解决这个问题我们就要用到接口签名的方案,
推荐下自己做的SpringBoot的实战项目:https://githucom/YunaiV/ruoyi-vue-pro
签名流程
片
推荐下自己做的SpringCloud的实战项目:https://githucom/YunaiV/onemall
签名规则
线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret加入timestamp,5分钟内数据有效加入临时流水号nonce,至少为10位。针对查询接口,流水号只用于日志落地,便于后期日志核查。针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。加入签名字段signature,所有数据的签名信息。
以上字段放在请求头中。
签名的生成
签名signature字段生成规则
所有动态参数=请求头部分+请求URL地址+请求Request参数+请求Body
上面的动态参数以key-value的格式存储,并以key值正序排序,进行拼接
最后拼接的字符串在拼接appSecret
即拼接成一个字符串,然后做md5不可逆加密
请求头部分
请求头=“appId=xxxx&nonce=xxxx×tamp=xxxx&sign=xxx”
请求头中的4个参数是必须要传的,否则直接报异常
请求URL地址
请求URL地址
请求Request参数
即请求为Get方式的时候,获取的传入的参数
请求Body
即请求为Post时,请求体Body
从requestinputstream中获取保存为String形式
签名算法实现
基本原理其实也比较简单,就是自定义filter,对每个请求进行处理;整体流程如下
验证必须的头部参数获取头部参数,request参数,Url请求路径,请求体Body,把这些值放入SortMap中进行排序对SortMap里面的值进行拼接对拼接的值进行加密,生成sign把生成的sign和前端传入的sign进行比较,如果不相同就返回错误
我们来看一下代码
@Component
public class SignAuthFilter extends OncePerRequestFilter{
static final String FAVICON = '/favicon.ico';
static final String PREFIX = 'attack:signature:';
}
片
以上是filter类,其中有个appSecret需要自己业务去获取,它的作用主要是区分不同客户端app。并且利用获取到的appSecret参与到sign签名,保证了客户端的请求签名是由我们后台控制的,我们可以为不同的客户端颁发不同的appSecret。
我们再来看看验证头部参数
片
上其实就是验证是否传入值;不过其实有个很重要的一点,就是对此请求进行时间验证,如果大于10分钟表示此链接已经超时,防止别人来到这个链接去请求。这个就是防止盗链。
我们在来看看,如何获取各个参数
片
上面的流程中,会有个额外的安全处理,
防止盗链,我们可以让链接有失效时间利用nonce参数,防止重复提交
在签名验证成功后,判断是否重复提交,原理就是结合redis,判断是否已经提交过
片
总结
今天我们用签名的方式,对我们对外提供的接口起到了保护作用;但这种保护仅仅做到了防止别人篡改请求,或者模拟请求。
但是还是缺少对数据自身的安全保护,即请求的参数和返回的数据都是有可能被别人拦截获取的,而这些数据又是明文的,所以只要被拦截,就能获得相应的业务数据。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道SpringBootX入门》系列,已经101余篇,覆盖了MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近3W行代码的SpringBoot示例,以及超4W行代码的电商微服务项目。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点