接口测试中模拟常见的编码方式

为了安全,系统的接口数据往往是经过编码和加密的,在进行接口测试时就需要按照编码和加密的算法对接口数据进行编码和加密,才能成功的发送接口请求,同时也需要对服务端返回的数据进行解密和解码,才能判断返回的数据是否符合期望的结果。
 本篇文章,主要来探讨主要的编码方式以及如何使用python来实现

一、加密方式

1.1 MD5算法

  • MD5是一个非常常见的摘要(hash)逻辑。其特点就是小巧。速度快。特点如下:

    • 不可逆,所以摘要算法就不是一个加密逻辑
    • 相同的内容计算出来的摘要是一样的
    • 不同的内容(哪怕是一点不一样)计算出来的结果差别非常大
  • 在数学上,摘要其实计算逻辑就是hash

  • hash(数据)==》数字

    • 密码
    • 一致性检查
  • MD5的python实现

from hashlib import md5
obj=md5()
obj.update('test'.encode("utf-8"))
obj.update('wsii'.encode("utf-8"))
bs=obj.hexdigest()
print(bs)
  • 有些网站可以解密,这里的网站并不是直接解密MD5。而是“撞库”,就是在网站的数据库中存储了大量的md5,在查询的时候。只需要一条select 语句就可以查询到了。这就是传说中的撞库。如何避免撞库:md5在进行计算的时候可以加盐。加盐之后,就很难撞库了
from hashlib import md5
salt="我是盐,把我加进去就没人能破解了”
obj=md5(salt.encode("utf-8"))#加盐
obj.update("test".encode("utf-8"))
bs=obj.hexdigest()
print(bs)
  • 扩展:sha256

    • 不论sha1,sha256,md5都属于摘要算法。都是在计算hash值。只是散列的程度不同而已。这种算法有一个特性。他们是散列。不是加密。而且,由于hash算法是不可逆的,所以不存在解密逻辑

1.2url编码

import urllib.parse
s=' 123'
ret=urllib.parse.quote(s)
print(ret)
s=urllib.parse.unquote(ret)
print(s)
params={'name':'张三','age':20,'address':'北京昌平区'}
query_string=urllib.parse.urlencode(params)
print(query_string)
query_string='name=%E5%BC%A0%E4%B8%89&age=20&address=%E5%8C%97%E4%BA%AC%E6%98%8C%E5%B9%B3%E5%8C%BA'
params=urllib.parase.parse_qs(query_string)
print(params,type(params))

1.3 base64编码

  • base64是什么

    • base64编码,是由64个字符组成编码集:26个大写字母A-Z,26个小写字母a-z,10个数字0-9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据
    • 当原始数据凑不够三个字节时,编码结果中会使用额外的符号“=”来表示这种情况
  • base64原理
    在这里插入图片描述

    • 一个base64字符实际上代表着6个二进制位(bit),4个base64字符对应3字节字符串/二进制数据
    • 3个字符为一组的base64编码方式如下:
      在这里插入图片描述
  • base64过程
    在这里插入图片描述

  • 最后处理完的编码字符串在转字节中不在有base64以外的任何字符。

  • base64代码实现

import base64
bs='you'.encode('utf-8')
#把字节转化为b64
print(base64.b64encode(bs).decode())
bs="yo".encode("utf-8")
#把字节转化为b64
print(base64.b64encode(bs).decode())
#猜测结果
bs="y".encode('utf-8')
#把字节转化成b64
print(base64.b64encode(bs).decode())
  • 注意,b64处理后的字符串长度,一定是4的倍数。如果在网页上看到有些密文的b64长度不是4的倍数会报错。
  • 例如
import base64
s='ew91'
ret=base64.b64decode(s)
print(ret)
s="ew91eQ=="
ret=base64.b64decode(s)
print(ret)
s="eW91eQ"
ret=base64.b64decode(s)
print(ret)
  • 解决思路,base64长度要求,字符串长度必须是4的倍数。填充一下即可
s="eW91eQ"
s+=("="*(4-len(s)%4))
ret=base64.b64decode(s).decode()
print(ret)
  • base64变种
#方式1
data=res.text.replace("-","+").replace("_","/")
base64.b64decode(data)
#方式2
data=base64.b64decode(res.text,altchars=b"-_")#base64解码成字节流
  • 为什么需要b64

    • 早年制定的一些协议都是只支持文本设定的。随着不断发展需要支持非文本了,才搞了一个base64做兼容
    • 虽然编码之后的数据与加密一样都具有不可见性,单编码和加密的概念并不一样。编码是公开的,如何人都可以解码;而加密则相反,你只希望自己或者特定的人才可以对内容进行解密。
    import base64
    source="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA7VBMVEUAAADs8v+txP+qwv+4zf/w9f/2+P+hu//Q3f+yyP+4zf/Q3f+kvv+90P+80f+2yv/S4P/T4P/M2//z9/+cuP/V4P9Whv9Uhf9Sg/9Pgf9NgP/8/f9di/9Xh/9lkf5aif9qlP7z9//k7P/c5v+2y/94nv51nP6lv/+LrP6Ep/6BpP5gjf7v9P+wxv/U4f/M2/+sxP+vxv73+f/P3v/J2v+5zf+ivP+fuv9xmf+Ytv6Usv6Hqf58of5vl/7m7v/g6f+zyf6QsP75+//q8P/B0v/W4//C1P6+0P6qwv6ct/76fHZiAAAAGnRSTlMAGAaVR/Py45aC9Mfy2b8t9OPZ2ce/v4L0x/e74/EAAAIZSURBVDjLZVPXYuIwEDSmQ4BLv5O0ku3Yhwu2IZTQe0hy7f8/57QSoYR5sVea1c424wgzl324LRRuH7I507hEJluYucCFEOBGhWzmy7X5+N0WwIjTbrcdBsKulM0z96onGCGE2X6n+cTkj/CqJ480igzkNXp26E9JkABSbBz8i4Bn3EkH840mKHoxs49fZQzt2Kd03FQEzSB3WsejB9Jqf1CJQBM0wCurABWBoub0gkDENwyStTHA62pwSWDtklRQ4FLfjnaiPqVW60hAYeLKNHIREOZuKTL80H6XBFCwn4BAmDOyLiOQUIlOSEjaoS+Ju57NZuul73Fml4w6yAivSLBW3MGfcfBmIegmArg3alICdJHgy1jQt8Z/6CcC4DdGXhLIoiWRACpbLYbDYW80GnXp2GH8ShP+PUvEoHsAIFq9Xm8+kXlIwkkI9pm+05Tm3yWqu9EiB0pkwjWBx2i+tND1XqeZqpPU4VhUbq/ekR8CwTRVoRxf3ifTbeIwcONNsJZ2lxFVKDMv1KNvS2zXdrnD+COvR1PQpTZKNlKD3cLCOJNnivgVxkw169BunlKFaV9/B+LQbqOsByY4IVgDB59dl/cjR9TIJV1Lh7CGqUqH/DDPhhZYOPkdLz6m0X7GrzPHsSe6zJwzxvm+5NeNi8U5ABfn7mz7zHJFrZ6+BY6rd7m8kQtcAtwwXzq4n69/vZbP1+pn6/8fsrRmHUhmpYYAAAAASUVORK5CYII="
    s=source.split(",")[1]
    with open("a.png",''wb) as f:
    	f.write(base64.b64decode(s))
    
    
    
    
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值