摘要算法:

对明文编码生成信息摘要,以防止被篡改。比如MD5使用的是Hash算法,无论多长的输入,MD5都会输出长度为128bits的一个串。

摘要算法不要秘钥,客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文

对称加密:

对称加密算法是共享密钥加密算法,在加密解密过程中,使用的密钥只有一个。发送和接收双方事先都知道加密的密钥,均使用这个密钥对数据进行加密和解密。

数据加密:在对称加密算法中,数据发送方将明文 (原始数据) 和 加密密钥一起经过加密处理,生成复杂的密文进行发送。

数据解密:数据接收方收到密文后,使用加密的密钥及相同算法的逆算法对加密的密文进行解密,将使其恢复成可读明文。

非对称加密

非对称加密算法,有两个密钥,一个称为公开密钥 (publickey),另一个称为 私有密钥 (private key),加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。

如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。

如果使用私钥对数据进行加密,只有用对应的公钥才能进行解密。

常见加密算法的处理方式

根据上述常见的加密算法,测试人员在测试不同的加密接口可采用下述的方法处理加密接口

摘要算法(MD5.SHA1 ):造接口数据前调用MD5,SHA1进行编码,服务端对比编码后的字符串是否一致。

对称加密算法(AES,DES ):造接口数据前从开发获取对称公钥,基于对称公钥可以加密请求数据,解密响应报文。

非对称加密算法(RSA):造接口数据前从开发获取公钥私钥去加密解密接口数据

用户认证

一般的接口测试工具都会提供一个User Auth/Authorization的选项,以Postman为栗子,你可以看到以下的选项:

基本认证(Basic Auth)

摘要认证(Digest Auth)

OAuth 1.0a

OAuth 2.0(最常见,现在的网站接口多数提供此用户认证方式)

在对应的工具上,你可以选取对应的用户认证选项,这里CC先生主要介绍如果用Python如何实现用户认证。

1 首先安装Requests库,Requests库的get()和post()方法均提供有auth参数,用于设置用户签名。

2 假定我们有一个接口为添加一个新的公告,接口需要认证:auth=("username","password")

nid 或 name两个参数二选一

3 伪代码:

def test_get_notice_list_nid_sucess(self):    auth_user = ('admin' , 'admin123456')    r = requests.get(self.base_url, auth = auth_user, params = {'nid' : 1})    result = r.json()    self.assertEqual(result['status'], 200)

数字签名

在使用 HTTP/SOAP 协议传输数据的时候,签名作为其中一个参数,可以起到关键作用:

先来一个简单的,通过客户的密钥,服务端的密钥匹配;

这个很有好理解,例如一个接口传参为:

http://127.0.0.1:8000/api/?a=1&b=2

假设签名的密钥为:@signpassword

加上签名之后的接口参数为:

http://127.0.0.1:8000/sign/?a=1&b=2&sign=@signpassword

但是,这样的sign 参数明文传输是不安全的,一般会选择一些加密算法,比如MD5 算法(MD5算法是不可逆向的),比如MD5代码如下:

import hashlib  md5 = hashlib.md5()sign_str = "@signpassword"sign_bytes_utf8 = sign_str.encode()md5.update(sign_bytes_utf8)sign_md5 = md5.hexdigest()print(sign_md5)

执行后得到:6648e929329e53e7a91c50ae685a88b5

此时带签名的接口为:

http://127.0.0.1:8000/sign/?a=1&b=2&sign=6648e929329e53e7a91c50ae685a88b5

所以,当服务器接收到请求后,同样需要对“signpassword”进行 MD5 加密,然后,比对与调用者传来的 sign 加密串是否一致,从而来鉴别调用者是否有权限使用该接口。

接着,我们来理解一个复杂一点的:把sign参数传递为api key(申请获取)+timestramp(时间戳)同样需要 用代码来实现,原理和上面这个一致的。(伪代码)

def setUp(self):       self.base_url = "http://127.0.0.1:8000/api/sec_add_notice/"    # app_key    self.api_key = "&APIkey"    # 当前时间    now_time = time()    self.client_time = str(now_time).split('.')[0]    # sign    md5 = hashlib.md5()    sign_str = self.client_time + self.api_key    sign_bytes_utf8 = sign_str.encode(encoding="utf-8")    md5.update(sign_bytes_utf8)    self.sign_md5 = md5.hexdigest()

接口加密

通常接口会使用更复杂一点的方式来进行加密的操作,常见的是AES的使用,放一张图让大家感受一下AES加解密的过程:

Python里面有一个很好的黑魔法,叫PyCrypto库,支持常见的 DES、AES 加密以及 MD5、SHA 各种 HASH 运算。

官方网站下载最新版本:

https://www.dlitz.net/software/pycrypto/

另外,也可以在 PyPi 仓库中下载安装:

https://pypi.python.org/pypi/pycrypto

对于AES的加密来说,看一下用了PyCrypto库的结果

加密:

from Crypto.Cipher import AESobj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')message = "The answer is no"ciphertext = obj.encrypt(message)print(ciphertext)

程序运行后的结果为:

b'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'

AES加密里面有两个关键,一个是key(必须为16,24,32位),一个是VI(必须为16位)

解密:解谜者必须要同时知道key和VI才可以解密

obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')s = obj2.decrypt(ciphertext)print(s)

由于Crypto库的作者已停止维护,现推荐安装:

 pip install pycrytodome

pycryptodome官方文档:

https://www.pycryptodome.org/en/latest/

下面以Jmete为例介绍如何实现加密接口的处理,针对这种接口测试的时候,在发起请求以前,我们需要对接口进入如下特殊处理:

1.和开发沟通接口加密的算法以及需要的信息,如果是SHA加密,和开发沟通获取加密的秘钥,以及加密和编码的关键字符串

2.在发起接口请求以前,对接口明文数据进行预处理,在Jmeter的接口实现中,可以通过添加Beanshell脚本,在Beanshell脚本中基于上一个步骤获取到的信息,采用和服务端相同的加密方法和加密流程对接口明文进行加密和编码

3.基于加密后的密文发起加密请求

api接口加密_接口加密如何测试?相关推荐

  1. java脚本接口自动化测试_接口自动化测试实践的记录

    接口测试实践的记录 在敏捷开发交付的流程中,自动化测试实际上被放在一个看起来挺重要的位置,而自动化测试中,接口测试是一个投入产出比比较高的 一种自动化测试的形式,而我自己也做了一个这样的脚手架一样的东 ...

  2. bfv同态加密_同态加密综述

    目前大部分内容翻译自维基百科, 后续会根据调研情况不断丰富. 基本概念 同态加密(Homomorphic encryption) 是一种可以支持在密文上进行计算的加密方式, 对在密文上计算得到的结果进 ...

  3. bfv同态加密_同态加密入门教程

    在这篇文章中,我们将了解同态加密的基本概念,介绍常用的同态加密开发库,学习同态加密应用开发的一般步骤,了解如何在Web应用中添加同态加密支持. 1.同态加密概述 同态加密改变了隐私保护的游戏规则,它允 ...

  4. bfv同态加密_同态加密简明教程

    在这篇文章中,我们将了解同态加密的基本概念,介绍常用的同态加密开发库,学习同态加密应用开发的一般步骤,了解如何在Web应用中添加同态加密支持. 1.同态加密概述 同态加密改变了隐私保护的游戏规则,它允 ...

  5. 实习二 分组密码加密_分组密码加密模式

    在分组密码中,一般所选用的密码算法都是公开的,加密过程中,只有密钥是保密的.一旦密钥固定,那么可以将加解密过程视为一个映射,例如AES算法,每加密一次,就可以视为128bit到128bit的数据映射. ...

  6. java ecb加密_各加密模式的演示(ECB,CBC) .

    对于较长的明文进行加密需要进行分块加密,但是直接加密(ecb)不容易隐藏模式,用OpenCV写了个程序论证了一下 ECB 优点就是简单,可以并行计算,不会迭代误差 缺点就是隐藏不了模式 CBC 需要初 ...

  7. 函数加密_同态加密__密码学课堂笔记

    背景 对称.公钥加密算法解密密文,得到的是明文的全部信息.但是我们希望能够对密文的访问附加特殊的要求,使访问者只得到明文的一个函数值,而不会泄露明文. FE的核心要求:对明文的灵活访问 FE密钥:基于 ...

  8. win10文件夹加密_文件加密精灵,保护你的隐私!

    官方介绍: 文件加密精灵是一款使用方便,安全可靠的文件加密利器.电脑上的任何文件都能做加密处理,有效的保证你的隐私. 主要功能: 文件加密 .文件夹加密 .软件加密(程序锁.软件锁).文件夹伪装.文件 ...

  9. java 接口继承_接口是否可继承接口(java)

    展开全部 Java语法中,接口32313133353236313431303231363533e59b9ee7ad9431333366303839可以继承接口,抽象类可以实现接口,抽象类可以继承实体类 ...

最新文章

  1. P1164 小A点菜
  2. IIS发生意外错误0x8ffe2740
  3. Python线程join和setDaemon
  4. 充满想象力的 JavaScript 物理和重力实验
  5. 浏览器的安全设置在哪里?要如何设置
  6. python 如何修改字典的key值_Python编程:如何把元组/字典作为参数传递给函数(附代码)...
  7. win10 中午未使用 内存占用增高_清理磁盘空间【win10篇】
  8. 计算机管理要继续请输入,若要继续,请键入管理员密码然后单击是问题解决方法...
  9. Dijkstra+DFS模板总结
  10. mysql s x锁_mysql 的S 锁和X锁的区别
  11. EonerCMS——做一个仿桌面系统的CMS(十四)
  12. C语言字符串函数(strcpy,strlen,strcat,stsstr,strchr,strcmp,memcpy,memmove)
  13. python二分查找例题_Python查找数组中数值和下标相等的元素示例【二分查找】
  14. cadnaa噪声分析测试软件,德国Cadna/A环境噪声模拟软件系统介绍
  15. linux把m4s格式转换mp4,video - ffmpeg将m4s转换为mp4 - SO中文参考 - www.soinside.com
  16. ios 旋转屏幕试图切换_iOS播放器横竖屏切换的实现
  17. /etc/shadow可以破解吗?
  18. (2021总结篇)面向对象软件设计模式--(八)结构型模式---树形结构的处理--组合模式
  19. 各抢票软件的优势,抢火车票成功率高的APP
  20. 软考高项-项目管理师知识点整合

热门文章

  1. linux 内核编号含义_linux内核(kernel)版本号的意义
  2. pthread线程传递数据回主线程_操作系统4:线程(1)
  3. shell分割参数为数组并循环执行jar,异常时退出循环
  4. go build 无文件_Go学习_30_Golang代码性能分析工具
  5. numpy产生一个大于0的随机数_Numpy中常用随机函数的总结
  6. Channel shutdown: channel error; protocol method
  7. maven坐标Dependencies和Exclusions详解
  8. springboot下载TXT文件时会将后台返回的成功信息一并返回
  9. vue升级之路(四)-- Vuex
  10. android ijkplayer c层分析-prepare过程与读取线程(续1-解码粗略分析)