博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
robotframework 接口测试 +RSA 加密
阅读量:5172 次
发布时间:2019-06-13

本文共 3121 字,大约阅读时间需要 10 分钟。

首先,实现RSA加密,需要用到pycrypto这个库,这个库又依赖openssl,所以需要先下载openssl,具体教程可以参考

安装完成后就可以安装pycrypto, pip install pycrypto ,如果报的错是VC++ ,那么就现在安装vc++在安装pycrypto ,
java版的加密函数如下:

public static String sign(byte data, final String privateKey) throws Exception {    byte keyBytes = Base64Utils.decrypt(privateKey);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance("RSA");    PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);    Signature signature = Signature.getInstance("MD5withRSA");    signature.initSign(privateK);    signature.update(data);    return Base64Utils.encrypt(signature.sign());}

具体的python函数如下:

import hashlibimport base64from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHAfrom Crypto.Hash import MD5priKey = '''-----BEGIN RSA PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAN8M7oBSoZOzAoxL3tmzku/ZTtQn/BBqfe8jj0GZeFKh0IY8qDpFrNONzxp4S+TH4xCXYyEFkkEIcS9SKMCbqba-----END RSA PRIVATE KEY-----'''def sign(self, signdate):        reload(sys)        sys.setdefaultencoding('utf-8')        h=MD5.new(signdate)        signer = PKCS1_v1_5.new(RSA.importKey(priKey))        signn = signer.sign(h)        signn=base64.urlsafe_b64encode(signn)        return signn

priKey是私钥,每个公司的私钥是不一样的。

在robotframework中导入自己写的py文件就可以调用sign了,但是这个签名结果后面多了一个‘=’,需要加一步替换,把=替换为空,

在python内置的base64库中,可以直接进行编码,base64.b64encode,但是编码后的数据可能会出现‘+’或者‘/’,这在rul中是不能作为参数的,而base64.rulsafe_b64encode则把‘+’或‘/’转换成‘-‘或者’_‘。具体编码函数看需求,如果是做url则必须用urlsafe
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉,这也就是上面提到的为什么多了一个’=‘。
get。
接口测试第一步是创建session,第一个参数是alias,也就是命名,识别用的,第二个参数为url,第二行为rsa加密,看需要,第五行是创建头文件(具体参数看公司需求),第六行是参数变量,第八行即为连接api,第一个参数是alias,需要跟上面的保持一致,第二个参数是uri,第三第四为头文件跟参数变量

 
post
post跟get基本一致,在post需要注意接口传参是用data还是用params。params是在请求url里的参数,而data是请求body里的,可以是json,也可以是urlencoded,试具体情况而定(经雪霁大神指正)。

data如下,其实也就是把params改成data

 
使用params还是data对签名也有影响,使用params时,签名需要把所有参数附上,而且得按字母排序,用data时就不用加上参数。(本公司RSA加密的签名规则是这样,其他公司的具体的就不知道了,不懂得可以问问公司开发人员)具体如下:

/public/corporate/fund/proposa?fundCode=${fundCode}&investmentAmount=${investmentAmount}&x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0/public/corporate/fund?x-api-key=I&x-api-timestamp=${timestamp}&x-api-version=2.0

在我这里,rsa加密,如果参数是json格式,那么在加密的时候是不需要加参数的,参数直接在post request用data进行传输,数据在这里有一个需要注意的地方,那就是

{  "accountNumber": "IF2016070100000044",  "corporateUserCode": 0,  "investorPayId": 28,  "merchantNumber": "IF2017112100003",  "password": "if123",  "payMethod": 0,  "purchaseFunds": [    {      "currency": "156",      "fundCode": "0408",      "investmentAmount": 10    }  ],  "riskConfirmed": 1}

json里面有没有出现数组,即有没有出现中括号’[’,‘ ]‘,有的话,需要先进行create dictionary 之后再进行create list,这样传输的数据才能正确。

时间戳:
获取当前时间的时间戳为:${date} get time epoch;get time 是内置库BuiltIn的关键字
把时间转成时间戳:${date} Convert Date 2017-11-22 10:00:00 epoch;Convert Date是Date Time库的关键字
把时间戳转成时间:${date} get time ‘空一格’ ${time};注意在空一格那位置上空一格。。
 
有什么错误的地方欢迎大家指点,共同学习。

转载于:https://www.cnblogs.com/changyou615/p/8776780.html

你可能感兴趣的文章
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
centos 引导盘
查看>>
Notes of Daily Scrum Meeting(12.8)
查看>>
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>