Hi,大家好。我們在接口自動化測試項目中,有時候需要一些加密。今天給大伙介紹Python/ target=_blank class=infotextkey>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、簡介
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_.NET, 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'"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.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'kx81x06x95xbb7x1bx7fxd2xafx97x0f,xfexa5xf3`$>x07x98:x9axcbxbax13xf9xc1x1cx18x193|xe2?xa2sxc71x9axf1xeeVx0c%PBFxddxdbxf3xbfhOxd0xcdx06}Tx18xc5xa82x0b'
解密后明文:
ITester
八、總結
上面講了多種加密方法,我們簡單總結下:
- 數據加密方式大體分為3類:單向加密、對稱加密和公鑰加密(非對稱加密)。
- 這3類加密方式都各自包含不同的加密算法,如單向加密方式中包含MD5、SHA1、SHA256等,這些算法又稱為“哈希算法”或“散列算法”或“數據摘要算法”。
- Python內置的hashlib和hmac只提供了單向加密的各種算法實現,如果要做對稱加密或者公鑰加密操作需要安裝第三方擴展模塊,常用的是pycrypto模塊。另外,hmac允許在使用哈希算法計算數據摘要時使用一個密鑰。
- 隨機數操作可以通過三個模塊來實現,Python內置的random模塊和secrets模塊(Python 3.6中才可用),還可以通過pycrypto模塊中的Crypto.Random子包中的模塊來完成。
- base64只適合編碼小段數據,且不能用于數據加密(算法是公開的,且沒有密鑰,所有人都可以解碼)。
- pycrypto是一個加密算法庫,幾乎所有的加密算法都可以在它里面找到相應的實現模塊。