接口测试 — 9.接口签名sign原理

1、什么是加密以及解密?

  • 出于信息保密的目的,在信息传输或存储中,采用密码技术对需要保密的信息进行处理。使得处理后的信息不能被非受权者(含非法者)读懂或解读,这一过程称为加密。
  • 在加密处理过程中,需要保密的信息称为“明文,经加密处理后的信息称为“密文”。加密即是将“明文”变为“密文”的过程。
  • 与此类似,将“密文”变为“明文”的过程被称为解密。

2、加密方式的分类

(1)对称加密
  • 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。

  • 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

  • 对称加密通常使用的是相对较小的密钥,一般小于256 bit。

    因为密钥越大,加密越强,但加密与解密的过程越慢。

    如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;

    但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。

    密钥的大小既要照顾到安全性,也要照顾到效率,

  • 对称加密的一大缺点是,密钥的管理与分配。

    换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。

    在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。

    现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

  • 常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

(2)非对称加密
  • 非对称加密为数据的解加密与密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。

  • 私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。

  • 非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

    比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人:银行,才能对你的消息解密。

    与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

  • 虽然非对称加密很安全,但是和对称加密比起来,它非常的慢。所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

  • 非对称加密的典型应用是数字签名。

  • 常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

    目前最常用的非对称加密算法是RSA算法。

(3)总结:

对称加密:

  • 定义:加密和解密使用的是同一个秘钥,例如:AESMD5
  • 特点:加密和解密效率高,安全性低。

非对称加密:

  • 定义:加密使用的是公钥,解密使用私,例如:RSA
  • 特点:安全性高,加密解密效率低。

3、接口签名sign原理

(1)什么是接口签名?

是使用用户名密码时间戳和所有的排过序之后的参数,拼接组合起来成为一个串,再把该串加密得到的字符串,这就是一个签名。

该签名字符串是唯一的有权访问第三方接口的鉴权码。

(2)为什么需要做接口签名
  1. 防伪装攻击。
  2. 防篡改攻击。
  3. 防重放攻击。
  4. 防数据泄露 。

在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。其中我认为最终要的还是数据是否被篡改。

(3)接口签名的实践方案

1)、明确请求身份

为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。

也有的人叫appidappsecret,针对不同的调用方分配不同的appidappsecret

(一般16-32位长,字母和数字组成,由开发提供。)

2)、生成signature(签名)

  • 步骤1:对所有请求参数按key的ASCII码做升序排列。

    例如:

    {"c":"3","b":"2","a":"1"}

    排序之后:
    {"a":"1","b":"2","c":"3"}

  • 步骤2:把请求参数拼接组合成串。

    把所有排好序的请求参数,使用URL键值对的格式,即key1=value1&key2=value2…的格式,拼接成字符串,设位sign_temp。

  • 步骤3:把AccessKeySecretKey码加入上面拼接好的字符串。

    可以灵活添加,可以把两个参数都加在字符串sign_temp前面。

    也可以把两个参数都加在字符串sign_temp后面,或者一前一后。

    例如:AccessKey=admin&SecretKey=123456&a=1&b=2&c=3

    (这个规则都是开发定义好的。)

  • 步骤4:用时间戳连接到字符串的尾部。

    例如:AccessKey=admin&SecretKey=123456&a=1&b=2&c=3×tamp=3424234....

  • 步骤5:然后再把这个字符串进行MD5加密,加密后再转化成大写。

    7CB6DFDCB3BAED652BF6A09D2ACDE34F

这串字符串就是signature(签名)

说明:

  • 这里使用了MD5的算法进行签名,也可以自行选择其他签名方式,例如RSA,SHA等。

  • 在请求中带上时间戳,并且把时间戳也作为签名的一部分,在接口提供方对时间戳进行验证,只允许一定时间范围内的请求,例如10分钟。

    因为请求方和接口提供方的服务器可能存在一定的时间误差,建议时间戳误差在5分钟内比较合适。

    允许的时间误差越大,链接的有效期就越长,请求唯一性的保证就越弱。所以需要在两者之间衡量。

3)、接口的请求参数

已登陆接口为例:

请求参数:
{
    "username":"Jerry",
    "password":"Test123456",
    "signature":"7CB6DFDCB3BAED652BF6A09D2ACDE34F",
    "timestamp":"时间戳 " 
}

# 提示:
# signature和timestamp参数是提供实现接口加密,
# 但是不参与接口业务逻辑。

服务端收到请求的参数之后,接口会对signature进行解密和判断,是否符合请求标准。

符合标准之后就处理请求返回结果。

4)、编写测试用例

  1. 获得AccessKeySecretKey码。
  2. 通过算法获得signature(签名)。
  3. 把签名放入请求参数中。
  4. 剩余步骤与测试普通接口相同。

总结:

我们只要了解接口签名sign原理即可,关于实现代码,可以网上搜索,然后结合自己业务需求进行编码。

这里就不展示实际代码了。

你可能感兴趣的:(网络,自动化,单元测试,开发语言,职场和发展,python)