拿什么守护你,我的接口?-关于接口加密测试的乱弹

接口测试好做么?用什么来做接口测试合适呢?

这是刚接触接口测试的同学最常问的问题。
个人觉得这个和你在拍照的时候是直接用美图秀秀里面的滤镜模式和自己去学PS后期进行处理图片的逻辑是一样一样的。
在一般的情况下,滤镜处理出来的和PS出来的效果一样么?一样
但是在妹子需要在背景里面加个城堡,鲜花满地的时候,或者妹子需要做成女神一样的特效的时候
滤镜能处理么?不能。
PS能处理么?能!!!就是,就是,就是,学习成本稍微高一丢丢。
高的这一丢丢是什么呢?那就是我们经常在接口测试中遇到的各种各样用来守护接口的安全机制问题。
以下图片自行体会一下 接口测试工具和自行编写接口测试代码的区别。
美图秀秀的效果图:


1.jpg

PS处理的效果图:

2.jpg

为啥非要费劲的在接口上加上各种复杂的安全机制呢?
好问题。
如果你不想自己的信息轻易的被泄露出去,自家网站被攻击的瘫痪,公司倒闭,CEO跑路,男女朋友分手。。。还是乖乖的跟着CC先生看一下接口相关的安全机制吧。
一般接口开发中有以下常用的几种安全机制:

  • 用户认证
  • 数字签名
  • 接口加密

用户认证
一般的接口测试工具都会提供一个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加解密的过程:

1.png

详细的过程可以参见http://www.mamicode.com/info-detail-514466.html 或者自行百度。

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 AES
# 加密
obj = 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)

===
So,接口加密测试的关键就在于开发小哥哥们用了什么加密算法来加密接口。你用相同的加密算法来加密你要发送的值 即可。

CC先生说,现在有很多的公司也把加密的算法直接封装成一个类或者一个接口,也就是测试的时候,你直接调用加密的类或者加密的接口即可完成你的加密工作。剩下的接口测试和以往没加密的接口测试一样没两样了。
附送一个Pypi库里一堆加密算法库的链接,自取:
https://pypi.python.org/pypi?%3Aaction=search&term=crypt&submit=search

crypt.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,235评论 0 6
  • 前言 在这个互联网和移动互联网高速发展的时代,数据安全成了企业的头等大事。数据安全的范畴很大,包含:技术安全、服务...
    淡淡蓝调g阅读 9,360评论 8 22
  • 关于封面与文社的不多说,由于专题刚刚创立,加入人数不多所以文章封面可以自己独立制作。 关于文社:(此地还在施工中……)
    我的闵先生阅读 383评论 0 2
  • 《国王的演讲》是获得第八十三届奥斯卡奖的一部很有名的影片。主要说的是英国国王乔治六世,怎样从一个患有严重口吃的人,...
    木林心慢阅读 624评论 0 4
  • 职场是个很微妙的环境,总能让你发现更多的探索,于我就像一所学校,而这所学校里的知识确怎么也学不完。这跟我的工作有...
    刻度人生阅读 366评论 0 1