Python实现各种加密,接口加解密不说难
off999 2024-10-17 11:44 38 浏览 0 评论
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'ITester\xc8\xed\xbc\xfe\xb2\xe2\xca\xd4\xd0\xa1\xd5\xbb'
(2) 使用decode()解码
decode():bytes对象的方法,用于将二进制数据转换为字符串,也称为“解码”。
在设置解码采用的字符编码时,需要与编码时采用的字符编码一致。使用decode()方法时,同样不会修改原字符串。
二、Base64加密
1、简介
Base64是密码学的基石,用64个字符来表示任意二进制数据的方法。可以将任意的二进制数据进行Base64编码。所有的数据都能被编码为并只用65个字符就能表示的文本文件( 65字符:A~Z a~z 0~9 + / = )。
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、用途
- 加密注册用户的密码。
- 网站用户上传图片 / 文件后,将MD5值作为文件名。(MD5可以保证唯一性)
- key-value数据库中使用MD5值作为key。
- 比较两个文件是否相同。(在下载资源的时候,发现网站提供了MD5值,就是用来检测文件是否被篡改)
3、 Python中MD5的使用
由于MD5模块在python3中被移除,在python3中使用hashlib模块进行md5操作。
(1) 简单示例
输出结果:
加密前为 :ITester软件测试小栈
加密后为:45dc3931b34133a1ebd17e376884b35b
(2) 登录接口加密
md5进行用户登录网站进行密码加密的示例:
import socket, struct, json
ip_port = ("127.0.0.1", 8000)
back_log = 5
buffer_size = 1024
tcp_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模块完成两种操作:
- 生成安全随机数;
- 生成一个笃定长度的随机字符串,可用作令牌和安全URL;
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_PKCS5
import 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_str
print(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 AES
from Cryptodome import Random
from binascii import a2b_hex
data = 'ITester软件测试小栈'
#密钥必须为16(AES-128),24,32
key = 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 + cip
print(ciptext)
#解密需要 key和iv 生成AES对象,取前16位是iv
mydecrypt = AES.new(key,AES.MODE_CFB,ciptext[:16])
#取后16位是密钥
decrytext = mydecrypt.decrypt(ciptext[16:])
print(decrytext.decode())
输出结果:
b'"\xcbHz\xd1>\x08p\xdd\xbc\xf3C\x87l\xf3\xe5'
<Cryptodome.Cipher._mode_cfb.CfbMode object at 0x10df91eb0>
b'"\xcbHz\xd1>\x08p\xdd\xbc\xf3C\x87l\xf3\xe5\x0e\xdc\x8f\x1b\xc0\xe5U\xc6\xa5\'\x7f*\xa0\x8b\xa3\xebU\xef\xbc\xd7j\x05d4\x05'
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.encrypt(content, pubkey)
return (crypto, privkey)
# rsa解密
def rsaDecrypt(str, pk):
# 私钥解密
content = rsa.decrypt(str, pk)
con = content.decode('utf-8')
return con
(a, b) = rsaEncrypt("ITester软件测试小栈")
print('加密后密文:')
print(a)
content = rsaDecrypt(a, b)
print('解密后明文:')
print(content)
输出结果:
公钥: PublicKey(6814529323241172850728335141247508717269277267494229901386594011231139785660903876597435728831384748788754841049799215688731419667333062231824933307206319, 65537)
私钥: PrivateKey(6814529323241172850728335141247508717269277267494229901386594011231139785660903876597435728831384748788754841049799215688731419667333062231824933307206319, 65537, 6454447002622527176039652037136241453160399729960737093529936320752579012730277408644466653521211901816393814636252571192738395899494415991466200889769361, 4797673045355672432997022168818242182770881041225501784151212772936794554333725043, 1420382185034032902338315580117109933359732257353521366383139403561669333)
加密后密文:
b'k\x81\x06\x95\xbb7\x1b\x7f\xd2\xaf\x97\x0f,\xfe\xa5\xf3`gt;\x07\x98:\x9a\xcb\xba\x13\xf9\xc1\x1c\x18\x193|\xe2?\xa2s\xc71\x9a\xf1\xeeV\x0c%PBF\xdd\xdb\xf3\xbfhO\xd0\xcd\x06}T\x18\xc5\xa82\x0b'
解密后明文:
ITester
八、总结
上面讲了多种加密方法,我们简单总结下:
- 数据加密方式大体分为3类:单向加密、对称加密和公钥加密(非对称加密)。
- 这3类加密方式都各自包含不同的加密算法,如单向加密方式中包含MD5、SHA1、SHA256等,这些算法又称为“哈希算法”或“散列算法”或“数据摘要算法”。
- Python内置的hashlib和hmac只提供了单向加密的各种算法实现,如果要做对称加密或者公钥加密操作需要安装第三方扩展模块,常用的是pycrypto模块。另外,hmac允许在使用哈希算法计算数据摘要时使用一个密钥。
- 随机数操作可以通过三个模块来实现,Python内置的random模块和secrets模块(Python 3.6中才可用),还可以通过pycrypto模块中的Crypto.Random子包中的模块来完成。
- base64只适合编码小段数据,且不能用于数据加密(算法是公开的,且没有密钥,所有人都可以解码)。
- pycrypto是一个加密算法库,几乎所有的加密算法都可以在它里面找到相应的实现模块。
相关推荐
- 面试官:来,讲一下枚举类型在开发时中实际应用场景!
-
一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...
- 一日一技:11个基本Python技巧和窍门
-
1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...
- Python Enum 技巧,让代码更简洁、更安全、更易维护
-
如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...
- Python元组编程指导教程(python元组的概念)
-
1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...
- 你可能不知道的实用 Python 功能(python有哪些用)
-
1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...
- Python 2至3.13新特性总结(python 3.10新特性)
-
以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...
- Python中for循环访问索引值的方法
-
技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...
- Python enumerate核心应用解析:索引遍历的高效实践方案
-
喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...
- Python入门到脱坑经典案例—列表去重
-
列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...
- Python枚举类工程实践:常量管理的标准化解决方案
-
本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...
- 让Python枚举更强大!教你玩转Enum扩展
-
为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...
- Python枚举(Enum)技巧,你值得了解
-
枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...
- 登录人人都是产品经理即可获得以下权益
-
文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...
- Python常用小知识-第二弹(python常用方法总结)
-
一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)