1. 程式人生 > 實用技巧 >3.多執行緒TCP協議與加密方式

3.多執行緒TCP協議與加密方式

多執行緒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)