3.多執行緒TCP協議與加密方式
阿新 • • 發佈:2020-12-29
多執行緒TCP協議與加密方式
1.多執行緒TCP協議
客戶端
# 客戶端
import socket
sk = socket.socket() #建立物件
sk.connect(("127.0.0.1",8001)) #建立連線
while True:
sk.send(b"hello") #傳送資料
res = sk.recv(1024) #接收資料
print(res.decode())
sk.close() #斷開連線
服務端
# 服務端 """ 支援TCP協議下的多執行緒迸發,一個伺服器可以同時連線多個客戶端 """ import socketserver class MyServer(socketserver.BaseRequestHandler):#自定義類,必須繼承父類 def handle(self): conn = self.request #收發資料物件 while True: res = conn.recv(1024) #接收資料 print(res.decode()) conn.send(b"haohao") #傳送資料 #多執行緒TCP服務 ThreadingTCPServer((IP,埠號),自定義類) server = socketserver.ThreadingTCPServer(("127.0.0.1",8001),MyServer) server.serve_forever() #永不停機
2.hashlib 加密
"""
應用:
1.密碼加密
2.檔案校驗
md5演算法:
可以把字串變成具有固定32位長度的十六進位制字串
加密之後,不能反解回原來資料
"""
密碼加密
import hashlib import random # 一.md5演算法 # 基本寫法: hs = hashlib.md5() #1.建立md5物件 # 2.把要加密的資料放到新的物件裡,update(引數為二進位制位元組流) hs.update("123".encode("utf-8")) res = hs.hexdigest() #3.獲取十六進位制32位長度的字串 print(res,type(res),len(res)) #202cb962ac59075b964b07152d234b70 <class 'str'> 32 # 加鹽(加key) 加強保密性 hs = hashlib.md5("jyh".encode()) #加鹽 hs.update("123".encode()) res = hs.hexdigest() print(res) #5a5f13216c44d4ea9f5baa9a682ed4b9 # 動態加鹽 res = random.randrange(30000) hs = hashlib.md5(str(res).encode()) hs.update("123".encode()) res = hs.hexdigest() print(res) # 二.sha系列演算法 hs = hashlib.sha256() #64位長度 hs = hashlib.sha512() #128位長度 hs.update("123".encode()) res = hs.hexdigest() print(res,len(res)) # 三.hmac加密演算法 import hmac import os """ 語法: new( 鹽 , 需要加密的資料 ) 引數: 二進位制位元組流 """ # 基本寫法: key = b"abc" msg = b"123" hm = hmac.new(key,msg) res = hm.hexdigest() #獲取十六進位制32位長度的字串 print(res,len(res)) #725658455c63977e1b73a199970a9972 32 # 動態加鹽效果: # 隨機二進位制位元組流 """ os.urandom(位數): 返回隨機的二進位制位元組流,長度有位數決定 """ key = os.urandom(32) msg = b"123" hm = hmac.new(key,msg) res = hm.hexdigest() print(res,len(res)) #9ce4239361ccf8a1e09ed0d35bd7a7ff 32
檔案校驗
# 檔案校驗 import hashlib # 1.針對小檔案內容進行校驗 """ 可以一次性讀取檔案所有內容 """ def check(filename): hs = hashlib.md5() #建立md5物件 with open(filename,mode="rb") as fp: res = fp.read() #讀取檔案 hs.update(res) return hs.hexdigest() #返回資料 res1 = check("1.hashlib加密模組使用.py") res2 = check("1.hashlib使用.py") print(res1,res2) #如果res1和res2一樣,兩個檔案內容就是一樣的 # 2.針對大檔案的內容進行校驗 """ 不能一次性讀取檔案所有內容,需要分配加密 結論: update方法,可以把一個字串分解成多份,分開進行加密 得出的結果和整體字串進行加密的值是一致的 """ # 整體加密 hs = hashlib.md5() #建立md5物件 strvar = "黃河之水天上來,奔流到海不復回" hs.update(strvar.encode()) res = hs.hexdigest() print(res) #dea65c92721219ada5c872f4676e2951 # 分開加密 hs = hashlib.md5() #重新建立md5物件 strvar1 = "黃河之水天上來" hs.update(strvar1.encode()) strvar2 = ",奔流到海不復回" hs.update(strvar2.encode()) res = hs.hexdigest() print(res) #dea65c92721219ada5c872f4676e2951 # 大檔案校驗方法一: def check(filename): hs = hashlib.md5() with open(filename,mode="rb") as fp: while True: content = fp.read(10) #一次最多讀取10個位元組 if content: hs.update(content) else: res = hs.hexdigest() return res res1 = check("1.hashlib加密模組使用.py") res2 = check("1.hashlib使用.py") print(res1,res2) # 大檔案校驗方法二 import os def check(filename): hs = hashlib.md5() filesize = os.path.getsize(filename) #獲取檔案大小 with open(filename,mode="rb") as fp: while filesize: content = fp.read(20) #根據檔案大小讀取資料, hs.update(content) filesize -= len(content) #一次最多減去20位元組,直到filesize=0時,迴圈終止 return hs.hexdigest() res1 = check("1.hashlib加密模組使用.py") res2 = check("1.hashlib使用.py") print(res1,res2)