使用robotframework做接口测试4——搞定接口签名及密码加密
接口签名是我做接口测试撞到的第一块石头,刚到新公司,本来想默默憋出来一个大招,然后碰到了签名接口,直接给跪了。于是只好找开发哥哥帮忙,把签名算法的java文件拿到,一行行对着用python实现了一遍。大致的心路历程就是这样了,签名其实没什么好讲的,每个公司实现都不一样,java代码转成python代码也要点时间,传参类型和格式一定要对,调试的时候有人帮忙会快很多。
写这篇文章的目的之一,是粗略介绍一下自定义关键字的写法。另一目的是给有接口签名的小伙伴提供一些思路,不至于被一个老是变的字段吓到不敢前行。
有些小伙伴可能对签名什么的没有概念,那稍微解释一下。签名主要的作用是保证接口传值的完整性,一致性和安全性,一般会将时间戳及重要字段做成一个签名,作为一个参数传入,服务端收到请求后,首先对签名字段做校验,校验通过才做请求处理。在安全要求比较高一些的公司,比如金融行业,就会使用接口数字签名。
由于我们不是设计签名的,而只是翻译开发代码,就不考虑诸多细节了。假设签名签的字段为时间戳timestamp,重点字段:data1,data2,设备id:imei,签名的key为一个客户端和服务端约定的一个常量,如’abcd’。
算法过程如下:
- 对约定key值进行md5处理
- 将规定字段拼接成一个长字符串,拼接时用&符号做为连接,拼接前把字符格式都转成了字符串
- 将第二步得到的字符串进行md5处理
以下是胡七八诌的python代码,可运行:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import hashlib import json class md5Enc(object): def get_sign(self,data1,data2,imei="",t=""): ''' Examples: ${sign} | Get Sign | api.name | ${userinfo} | 357070058113616 | ${t_now} ''' #key string key="abcd" #第一步,key md5 keyMd5 = hashlib.md5() keyMd5.update(key) keyMd5= keyMd5.hexdigest() data2Str = json.dumps(data2) #第二步拼接签名 signBefore = data1 + "&" + data2Str + "&" + imei + "&" +\ t + "&" + keyMd5 #第三步sign md5 sign = hashlib.md5() sign.update(signBefore) sign = sign.hexdigest() return sign def get_pw_encrpt(self,pwBefore): '''write your encrpt code here''' print 'your encrpt code'
我的具体做法是把这个py文件命名为md5Enc.py(与类名一致)。py文件放在rf的项目文件里,如果和suite同级,以library的形式导入:
调用如下:
实际实践中,除了签名算法,还有密码加解密算法等,套路都差不多,有一些很简单的,只单纯一个md5的加密,应该用不到自定义关键字,稍微复杂一点的多层加密,什么AES啊,SHA256啊,base64啊,就考虑自己写写代码吧。