龙空技术网

Python接口自动化之通过RSA加解密

CoCo的软件测试小栈 165

前言:

此时朋友们对“base64和md5混合加密算法”可能比较着重,各位老铁们都需要剖析一些“base64和md5混合加密算法”的相关知识。那么小编在网络上搜集了一些关于“base64和md5混合加密算法””的相关内容,希望你们能喜欢,大家快快来学习一下吧!

点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。

本文2711字,阅读约需5分钟

Hi,大家好,我是CoCo。在之前的文章:Python实现各种加密,接口加解密不再难,介绍了Base64、MD5、Sha1、Secret、RSA等几种加密方式,今天结合项目具体介绍RSA加密。

RSA算法加密简介

01 介绍

RSA加密算法是一种非对称加密算法,加密的秘钥是由公钥和私钥两部分组成秘钥对,公钥用来加密消息,私钥用来对消息进行解密,公钥是公开的,私钥则是用户自己保留的,由于公钥是公开的,那么任何人只要获取到公钥,都可以使用公钥来加密发送伪造内容。

出于安全性考虑,在发送消息之前我们可以使用RSA来签名,签名使用私钥来进行签名,使用公钥来进行验签,通过签名我们可以确保用户身份的唯一性,从而提高安全性。

02 加密与签名的关系?

加密和签名都是为了安全性考虑,但略有不同。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。

(1) 加密

Task 1:Boss要给CoCo发送一条消息,分配保密的工作任务。

RSA的加密过程如下:

1.CoCo生成一对密钥(公钥和私钥),私钥不公开,CoCo自己保留。公钥为公开的,任何人可以获取。

2.CoCo传递自己的公钥给Boss,用CoCo的公钥对消息进行加密。

3.CoCo接收到Boss加密的消息,利用CoCo自己的私钥对消息进行解密。

在这个过程中,只有2次传递过程,第一次是CoCo传递公钥给Boss,第二次是Boss加密消息给CoCo,即使都被敌方截获,也没有危险性,因为只有CoCo的私钥才能对消息进行解密,防止了消息内容的泄露。

(2) 签名

Task 2:CoCo收到Boss发的消息后,需要进行回复“收到”。

RSA签名的过程如下:

1.CoCo生成一对密钥(公钥和私钥),私钥不公开,CoCo自己保留。公钥为公开的,任何人可以获取。

2.CoCo用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给Boss。

3.Boss收到消息后,在获取CoCo的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是CoCo回复的。

在这个过程中,只有2次传递过程,第一次是CoCo传递加签的消息和消息本身给Boss,第二次是Boss获取CoCo的公钥,即使都被敌方截获,也没有危险性,因为只有CoCo的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给Boss,防止了消息内容的篡改。

综合两个场景会发现,第一个场景虽然被截获的消息没有泄露,但是可以利用截获的公钥,将假指令进行加密,然后传递给CoCo。第二个场景虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签来获得,并不能防止泄露。

所以在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如CoCo和Boss都有一套自己的公钥和私钥,当CoCo要给Boss发送消息时,先用Boss的公钥对消息加密,再对加密的消息使用CoCo的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。

即:公钥加密、私钥解密、私钥签名、公钥验签。

Python实现RSA加解密

接下来我们使用 Python 来实现 RSA 加密与签名,使用的第三方库是Crypto

01 生成密钥对

创建RSA密钥,步骤如下:

1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码;

2、生成1024/2048位的RSA 密钥;

3、调用 RSA 密钥实例的 exportKey 方法,传入密码、使用的 PKCS 标准以及加密方案这三个参数;

4、将私钥写入磁盘的文件;

5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。

示例代码如下:

私钥如下:

公钥如下:

02 公钥加密和私钥解密

(1) 公钥加密

结果如下所示:

luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU=

(2) 私钥解密

import base64from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5def decrypt(en_data):    '''    en_data:加密过后的数据,传进来是一个字符串    '''    # base64解码    msg = base64.b64decode(en_data)    # 获取私钥    privatekey = open('private.pem').read()    rsakey = RSA.importKey(privatekey)    # 进行解密    cipher = PKCS1_v1_5.new(rsakey)    data= cipher.decrypt(msg, 'DecryptError')    # 解密出来的是字节码格式,decode转换为字符串    return data.decode()if __name__ == '__main__':    en_data="luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU="    print(decrypt(en_data))

结果如下所示:

ITester软件测试小栈

03 私钥签名与公钥验签

(1) 私钥签名

结果如下所示:

Eb7mtvQGHCuzOR475TPRCR95Qg4GK1Nhbdw2je83JBxPfD0WiZ1Di/vXgQ8eH9fmh5z80epATF0IGT3Lm4DJTgHq+apuvhtjYNKv4wnz7c5seTuqWXTEjA6h/PomqW/yMC5/cbPr7w+aYEpV+2E+NKc/brUS1e6+pN4vHkaOXwM=

(2) 公钥验签

from Crypto.Hash import SHAfrom Crypto.Signature import PKCS1_v1_5 as Sig_pkfrom Crypto.PublicKey import RSAimport base64def verify(data,sign) -> bool:    '''    :param msg: 明文数据,签名之前的数据    :param sign:接收到的sign签名    :return:    '''    # base64解码    data = base64.b64decode(sign)    # 获取公钥    key = open('public.pem').read()    rsakey = RSA.importKey(key)    # 将签名之前的内容进行hash处理    sha_name = SHA.new(sign.encode("utf-8"))    # 验证签名    signer = Sig_pk.new(rsakey)    res= signer.verify(sha_name, sign)    # 验证通过返回True   不通过返回False    return resif __name__ == '__main__':    # 签名之前的内容    data= "CoCo"    # 签名数据    sign="X3Gg+wd7UDh4X8ra+PGCyZFUrG+6jDeQt6ajMA0EjwoDwxlddLzYoS4dtjQ2q5WCcRhxcp8fjEyoPXBmJE9rMKDjEIeE/VO0sskbJiO65fU8hgcqdWdgbVqRryhOw+Kih+I6RIeNRYnOB8GkGD8Qca+n9JlOELcxLRdLo3vx6dw="    print(verify(data, sign)) 

结果如下所示:

False

结合项目实现RSA加解密

需求:接口需要时间戳及token前50位鉴权,通过RSA公钥加密得到签名字符串。

01 RSA封装

rsa封装可在ITester软件测试小栈微信公众号后台回复“rsa”,进行领取。

02 结合项目实现

(1) 处理鉴权信息

生成token前50位并与时间戳进行拼接:

from time import timedef generator_sign(token):    # 获取token的前50位    token_50 = token[:50]    # 生成时间戳    timestamp = int(time())    # print(timestamp)    # 接拼token前50位和时间戳    msg = token_50 + str(timestamp)    print(msg)    # 进行RSA加密    sign = rsaEncrypt(msg)    return sign,timestamp

(2) 配置请求信息

请求URL与请求头存放在配置文件,以下示例存放在.ini文件:

[server]url=

(3) 处理请求

发起请求时进行判断,如果auth_type为配置文件指定的类型并且token不为空,则带上加密的鉴权信息。(requests_handler.py 其他代码略)

    if conf.get("server","auth_type") == "xxx.itester" and token is not None:        from Common.handle_rsa import generator_sign        sign,timestamp = generator_sign(token)        data["sign"] = sign        data["timestamp"] = timestamp

总结:今天主要介绍了RSA加解密,RSA广泛用于加密与解密,还有数字签名通信领域。使用Publick/Private秘钥算法中, 加密主要用对方的公钥,解密用自己的私钥,签名用自己的私钥,验签用对方的公钥。

更多系列文章

敬请期待

我是CoCo,计算机科学与技术专业,深漂大厂互联网民工(女),坐标深圳。5年工作经验,3年持续输出技术文。ITester软件测试小栈(ID:ITestingA)号主,专注于软件测试技术和宝藏干货分享,每周准时更新原创技术文章,每月不定期赠送技术书籍,愿我们在更高处相逢。喜欢记得星标⭐我,每周及时获得最新推送,第三方转载请注明出处。

想获取更多最新干货内容

快来星标 置顶 关注

标签: #base64和md5混合加密算法