api签名认证原来如此简单

背景

背景: 写了几个模拟接口,为了防止恶意调用,准备了一些策略。

现在要做的是写一个真实将会被用户调用的接口,首先先创建一个新的项目。

准备提供三个接口 : post,get以及post传入json

那接口写好了,怎么调用呢 ? 前端和后端都可以调用,但是一般都是用后端去调用的,由于可能调用接口的时候会传入一些参数,如果直接被劫持就不好了。
在这里插入图片描述

接口调用方式

接下来介绍几种调用接口的方式:

几种HTTP 调用方式 :

  1. HttpClient
  2. RestTemplate
  3. 第三方库 (OKHTTP,Hutool)

这里使用hutool : 入门和安装 (hutool.cn)

参考文档当中的安装一节,引入依赖,全局搜索http,研究http客户端工具类httpUtils

根据它,我写好了相关的第三方调用的东西,然后做了一个test,之后我们再思考,谁都能随便调用这个接口吗 ? 如果有一个恶意用户一直调用,一方面他在刷我的流量,另一方面,也会影响其他正常的用户进行访问,现在问题是调用这个接口的时候,不像之前删除用户一样,起码有个session可以去判断是不是为管理员,这里用到的是一个签名认证的东西,之前面试官还问过我,我没答上来,这次要好好看一看!!
下面让我们隆重欢迎今天的主人公,签名认证,dangdangdangdang~~

api签名认证

之前web系统调用很多后端的东西,都是先看session当中的用户有没有这个权限,如果有的话就可以查看,是有状态的。登录一次,只要session会话存在,就可以一直延续这种状态。

而我们现在调用的接口,也这样去鉴别你的身份,也需要这样的用户名和密码,但是这种用户名和密码相对于web系统有些特殊,它并不是真正肉眼可见的用户名和密码,但是我通过这个可以知道你是不是我允许进入的人,我可不可以让你进来,另外它是无状态的,当然http本身也是无状态的,正是因为这样,才有了session,http请求是每次请求我不管你之前是不是请求过,我只认识你当前的这一次请求,这次我们接口用的也是这样,那这里的用户名和密码怎么办呢? 想起来之前用过百度接口,里面不是有一个API key (有的云服务商也叫access key)和一个(密钥) secert key吗?一般也叫ak和sk ,当时傻傻的不知道,反正就是能用就行,现在才明白前者是一个相当于用户名的东西,后者相当于是密码的东西,既然是无状态的,那么每次请求都需要携带,还带两个,所以我看百度那里根据这两个东西又生成了一个叫做access_Token的东西,以后只要每次携带这个就可以了,记得吗? 你当时请求可是每次都携带这个的,只不过你把它写到了常量包里,时间一长,可能有点忘记了。原来当时面试官问的是这个啊,害,就这?有什么难度?就是当时不知道而已哈哈哈。
在这里插入图片描述
其实jwt是签名认证的一个环节。

补充: CSRF跨站伪造请求攻击

CSRF攻击

跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是指,攻击者可能利用网页中的恶意代码强迫受害者浏览器向被攻击的Web站点发送伪造的请求,篡夺受害者的认证Cookie等身份信息,从而假冒受害者对目标站点执行指定的操作。FirefoxOpera等浏览器使用单进程机制,多个窗口或标签使用同一个进程,共享Cookie等会话数据。IE则混合使用单进程与多进程模式,一个窗口中的多个标签,以及使用“CTRL+N” 或单击网页中的链接打开的新窗口使用同一进程,共享会话数据;只有直接运行IE可执行程序打开窗口时,才会创建新的进程。Chrome虽然使用多进程机制,然而经测试发现,其不同的窗口或标签之间仍会共享会话数据,除非使用隐身访问方式。因而,用户同时打开多个浏览器窗口或标签访问互联网资源时,就为CSRF攻击篡夺用户的会话Cookie创造了条件。另外,如果一个Web站点提供持久化Cookie,则CSRF攻击将更直接、更容易 [3] 。

那么在数据库的用户表里面,新增两个字段,一个是accessKey 另一个是secretKey,先手动给用户分配一个,也可以自己写,这里先测试以下效果。

之后在调用接口的时候改造一下函数,让调用函数的时候也同时传递ak和sk。

签名认证

但是服务端之间直接传输secretKey并没有那么安全,万一被劫持了,那就有了下面的知识点 :

  1. 加密方式: 对称加密,非对称加密,md5签名(不可解密)

    用户参数 + 密钥 => 签名生成算法(SHA1,MD5,HMAC) => 不可解密的值

    abc + abcdefgh => sfjkdsfjlskfs

    怎么知道这个签名对不对? 服务端用一模一样的参数和算法去生成签名,只要和用户传的一致,就表示一致。

    但是就算加密了,万一被别人重放了呢? 重放就是别人相当于是一个代理服务器,用你的身份再次发送了一次请求。解决方法:

    1. 怎么防止重放?

      1. 加nonce 随机数,只能用一次

        缺点: 服务端要保存用过的随机数,如果数据量太大的话,占用空间

      2. 加timestamp时间戳,比如限制几分钟之内的不能用了,不能重放昨天的请求之类的,校验时间戳是否过期。

​ 一般来说,这两种方式可以配合使用。

Hutool的使用

用Hutool提供的进行签名加密:
在这里插入图片描述
在这里插入图片描述
API签名认证很灵活,具体要有哪些参数,要根据具体场景去看。

但是总的看下来,会发现写好的接口,这个接口是给别人调用的,但是每次请求的参数包括但不仅限于时间戳之类的,一些必要的参数比如accessKey传输没问题,但是其他的也要调用者传输的话,就有点麻烦了,所以这里需要有一个便于调用者调用代码的SDK,这样调用api的开发者也就不会抓狂了。

在这里插入图片描述
创作不易,给个心心啦~❤

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值