Hi,大家好,我們在介面自動化測驗專案中,有時候需要一些加密,今天給大伙介紹Python實作各種 加密 ,介面加解密再也不愁,
目錄
一、專案加解密需求分析
六、Python加密庫PyCryptodome
一、專案加解密需求分析
1、網路資料傳輸面臨的問題
很多人學習蟒蛇,不知道從何學起,
很多人學習python,掌握了基本語法之后,不知道在哪里尋找案例上手,
很多已經做了案例的人,卻不知道如何去學習更多高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費獲取視頻教程,電子書,以及課程的源代碼!
QQ群:101677771
歡迎加入,一起討論一起學習!
網路安全涉及很多方面,而網路資料的安全傳輸通常會面臨以下幾方面的威脅,
- 資料竊聽與機密性:怎樣保證資料不會因為被截獲或竊聽而暴露?
- 資料篡改與完整性:怎樣保證資料不會被惡意篡改?
- 身份冒充與身份驗證:怎樣保證資料互動雙方的身份沒有被冒充?
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 = https://www.cnblogs.com/pythonQqun200160592/p/json.loads(header_json)
print('收到報頭內容=', data)
total_size = data['total_size']
# 第三步:接收真實的資料
recv_size = 0
recv_data = https://www.cnblogs.com/pythonQqun200160592/p/b""
while recv_size < total_size:
data = https://www.cnblogs.com/pythonQqun200160592/p/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 = https://www.cnblogs.com/pythonQqun200160592/p/'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`$>\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是一個加密演算法庫,幾乎所有的加密演算法都可以在它里面找到相應的實作模塊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/387699.html
標籤:Python
