Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。
目录
一、项目加解密需求分析
六、Python加密库PyCryptodome
一、项目加解密需求分析
1、 络数据传输面临的问题
私信小编01即可获取大量Python学习资源
络安全涉及很多方面,而 络数据的安全传输通常会面临以下几方面的威胁。
2、解决方案
针对 络数据安全问题,可以用以下几种数据加密方式来解决(每种数据加密方式有多种不同的算法实现):
数据加密方式 |
描述 |
主要解决的问题 |
常用算法 |
对称加密 |
指数据加密和解密使用相同的密钥 |
数据的机密性 |
DES, AES |
非对称加密 |
也叫公钥加密,指数据加密和解密使用不同的密钥–密钥对儿 |
身份验证 |
DSA,RSA |
单向加密 |
指只能加密数据,而不能解密数据 |
数据的完整性 |
MD5,SHA系列算法 |
3、Python加密模块
主要用到以下几个模块:
模块名 |
描述 |
hashlib |
主要提供了一些常见的单向加密算法(如 MD5 , SHA 等),每种算法都提供了与其同名的函数实现。 |
hmac |
提供了hmac算法的实现,hamc也是单向加密算法,但是它支持设置一个额外的密钥(通常被称为’salt’)来提高安全性 |
secrets |
这是Python3.6中新增的模块,用于获取安全随机数。 |
base64 |
该模块主要用于二进制数据与可打印ASCII字符之间的转换操作,它提供了基于Base16, Base32, 和Base64算法以及实际标准Ascii85和Base85的编码和解码函数。 |
pycrypto |
支持单向加密、对称加密和公钥加密以及随机数操作,这是个第三方模块,需要额外安装。 |
4、字符串和Bytes互相转化
我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会 错。将字符串和Bytes互相转换可以使用encode()和decode()方法。
(1) 使用encode()编码
encode():str对象的方法,用于将字符串转换为二进制数据(即bytes),也称为“编码”。
输出结果:
原字符: ITester软件测试小栈字符转换成二进制: b'ITesterxc8xedxbcxfexb2xe2xcaxd4xd0xa1xd5xbb'
(2) 使用decode()解码
decode():bytes对象的方法,用于将二进制数据转换为字符串,也称为“解码”。
在设置解码采用的字符编码时,需要与编码时采用的字符编码一致。使用decode()方法时,同样不会修改原字符串。
二、Base64加密
1、简介
2、编码原理
1.将所有字符转化为ASCII码。
2.将ASCII码转化为8位二进制 。
3.将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。
4.统一在6位二进制前补两个0凑足8位。
5.将补0后的二进制转为十进制。
6.从Base64编码表获取十进制对应的Base64编码。
3、Python中base64的使用
Python内置的base64模块可以直接进行base64的编解码 。
输出结果:
加密前为 :ITester软件测试小栈加密后为:SVRlc3Rlcui9r+S7tua1i+ivleWwj+agiA==
三、MD5加密
1、简介
MD5加密即message-digest algorithm 5(信息-摘要算法),即信息-摘要算法,可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。
2、用途
3、 Python中MD5的使用
由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作。
(1) 简单示例
输出结果:
加密前为 :ITester软件测试小栈加密后为:45dc3931b34133a1ebd17e376884b35b
(2) 登录接口加密
md5进行用户登录 站进行密码加密的示例:
import socket, struct, jsonip_port = ("127.0.0.1", 8000)back_log = 5buffer_size = 1024tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_client.connect(ip_port)while True: cmd = input(">>>:") if not cmd: continue # 发送数据 tcp_client.send(cmd.encode("gbk")) # 第一步:先收 头 header = tcp_client.recv(4) # 第二步:从 头中解析(header数据的长度) header_size = struct.unpack("i", header) print('收到 头长度=', header_size) # 第三步:收到 头解析出对真实数据的描述信息 header_json = tcp_client.recv(header_size) data = json.loads(header_json) print('收到 头内容=', data) total_size = data['total_size'] # 第三步:接收真实的数据 recv_size = 0 recv_data = b"" while recv_size < total_size: data = tcp_client.recv(buffer_size) recv_data += data recv_size = len(recv_data) print('接收数据 =', recv_data.decode('gbk', 'ignore')) # 如果设置为ignore,则会忽略非法字符;tcp_client.close() # 关闭
四、sha1加密
1、简介
SHA1的全称是Secure Hash Algorithm( 安全哈希算法 ) 。SHA1基于MD5,加密后的数据长度更长,它对长度小于264的输入,产生长度为160bit的散列值。比MD5多32位,因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢。
2、 Python中Sha1的使用
示例如下:
输出结果:
加密前为 :ITester软件测试小栈加密后为:e933b46df326c0bb27cf075faf1d05eb92185f13
五、secrets加密
1、简介
secrets模块是Python 3.6新增的内置模块,它可以生成用于管理密码、账户验证信息、安全令牌和相关秘密信息等数据的密码强随机数。总体来讲,我们可以通过secrets模块完成两种操作:
2、 Python中secrets的使用
(1) 生成随机密码
生成一个由数字和字母组成的随机8位密码:
输出结果:
I4S8Nn81
(2) 生成包含安全令牌的URL
生成一个用于找回密码应用场景的,包含一个安全令牌的的临时URL。
输出结果:
https://ITester.com/reset=-b81gTnkWHaOyIKqv_EISLD1eHfYz8X5ptgYfhMBnbk
六、Python加密库PyCryptodome
1、简介
PyCrypto是 Python 中密码学方面最有名的第三方软件包,2012年已停止。幸运的是,该项目的分支PyCrytodome 取代了 PyCrypto。
2、DES加密
(1) 简介
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准。DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
(2) 使用
安装和导入:
安装:pip install pyDes导入:from pyDes import des, CBC, PAD_PKCS5
示例:
from pyDes import des, CBC, PAD_PKCS5import binascii# 秘钥KEY = 'keiHG$93'def des_encrypt(s): """ DES 加密 :param s: 原始字符串 :return: 加密后字符串,16进制 """ secret_key = KEY # 密码 iv = secret_key # 偏移 # secret_key:加密密钥,CBC:加密模式,iv:偏移, padmode:填充 des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) # 返回为字节 secret_bytes = des_obj.encrypt(s, padmode=PAD_PKCS5) # 返回为16进制 return binascii.b2a_hex(secret_bytes)def des_descrypt(s): """ DES 解密 :param s: 加密后的字符串,16进制 :return: 解密后的字符串 """ secret_key = KEY iv = secret_key des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) decrypt_str = des_obj.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5) return decrypt_strprint(des_encrypt("ITester"))print(des_descrypt("b248ebd299b31dd1"))
输出结果:
b'b248ebd299b31dd1'b'ITester'
3、3DES加密
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称,是DES向AES过渡的加密算法。
4、AES加密
高级加密标准(Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法。速度快,编码紧凑。
from Cryptodome.Cipher import AESfrom Cryptodome import Randomfrom binascii import a2b_hexdata = 'ITester软件测试小栈'#密钥必须为16(AES-128),24,32key = b'this is a 16 key'#生成长度等于AES块大小的不可重复的密钥向量iv =Random.new().read(AES.block_size)print(iv)#使用key和Iv初始化AES对象mycipher = AES.new(key,AES.MODE_CFB,iv)print(mycipher)cip = mycipher.encrypt(data.encode())#将iv加到加密的密钥开头ciptext =iv + cipprint(ciptext)#解密需要 key和iv 生成AES对象,取前16位是ivmydecrypt = AES.new(key,AES.MODE_CFB,ciptext[:16])#取后16位是密钥decrytext = mydecrypt.decrypt(ciptext[16:])print(decrytext.decode())
输出结果:
b'"xcbHzxd1>x08pxddxbcxf3Cx87lxf3xe5'<Cryptodome.Cipher._mode_cfb.CfbMode object at 0x10df91eb0>b'"xcbHzxd1>x08pxddxbcxf3Cx87lxf3xe5x0exdcx8fx1bxc0xe5Uxc6xa5'x7f*xa0x8bxa3xebUxefxbcxd7jx05d4x05'ITester
七、RSA加密
1、简介
RSA加密算法是一种非对称加密算法, 使用openssl ,keytools等工具生成一对公私钥对,使用被公钥加密的数据可以使用私钥来解密。
示例:
import rsa# rsa加密def rsaEncrypt(str): # 生成公钥、私钥 (pubkey, privkey) = rsa.newkeys(512) print("公钥: ", pubkey) print("私钥: ", privkey) # 明文编码格式 content = str.encode('utf-8') # 公钥加密 crypto = rsa.encr
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!