socketserver 模块
# 使TCP协议支持并发操作
# 服务端
import socketserver
class MyServar(socketserver.BaseRequestHandler): # 必须继承 BaseRequestHandler 类
def handle(self): # 必须定义handle函数.
"""
收发数据的逻辑
:return:
"""
conn = self.request # 获取客户端消息
cli_addr = self.client_address # 获取客服端 ip+端口
while True: # 循环
# 接收消息
msg = conn.recv(1024) # 收发数据的逻辑
print(msg.decode())
# 发送消息
data = input("发送消息")
conn.send(data.encode())
servar = socketserver.ThreadingTCPServer(("127.0.0.1",9006),MyServar) # 相当于创建,绑定,
servar.serve_forever() # While 循环一直监听是否有客户端请求到达 ...
# 客户端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",9006))
while True:
# 发送消息
data = input("发送消息")
sk.send(data.encode())
# 接收消息
msg = sk.recv(1024)
print(msg.decode())
sk.close()
hashlib & hmac 加密算法模块
# hashlib 加密算法模块
import hashlib
hm = hashlib.md5("加盐") # 创建md5对象并加盐
hm.updata("加密内容".encode()) # 更新内容进行算法运算
res = hm.hexdigest() # 拿到运算后的32位16进制数
# hmac 加密算法模块
import hmac
hn = hmac.new("加盐".encode(),"数据".encode())
res = hn.hexdigest()
print(res)
动态加密
import hashlib,os # rangdom也可以
salt = os.urandom(10000) # 获取长度为10000的随机字节流
hm = hashlib.md5(salt)
hm.update("我爱你".encode())
res_hm = hm.hexdigest()
print(res_hm)
文件校验
import hashlib,hmac
# 针对小文件一次性读出来
def hashmd5_file(hm,filename):
with open(filename, "rb") as f:
data = f.read()
hm.update(data)
return hm.hexdigest()
obj1 = hashlib.md5()
obj2 = hashlib.md5()
hm_ceshi1 = hashmd5_file(obj1,"ceshi1.txt")
hm_ceshi2 = hashmd5_file(obj2,"ceshi2.txt")
if hm_ceshi1 == hm_ceshi2:
print("校验合法")
else:
print("不合法")
# 针对大文件分批进行
def hmac_file(hn,file_name):
numsize = os.path.getsize(file_name)
with open(file_name, "rb") as f:
while numsize:
data = f.read(128)
hn.update(data)
numsize -= len(data)
return hn.hexdigest()
hn1 = hmac.new("盐".encode())
hn2 = hmac.new("盐".encode())
ceshi1 = hmac_file(hn1,"ceshi1.txt")
ceshi2 = hmac_file(hn2,"ceshi2.txt")
if ceshi1 == ceshi2:
print("校验合法")
else:
print("不合法")
服务器校验
# 模拟支付宝服务端
import socketserver,os,hmac
class MyServer(socketserver.BaseRequestHandler):
miyu = "夜袭寡妇村" # 密语
def handle(self):
conn = self.request
cil_addr = self.client_address
auth_code = os.urandom(128)
conn.send(auth_code)
cli_hmac = conn.recv(32).decode()
hn = hmac.new(auth_code, MyServer.miyu.encode())
servar_hmac = hn.hexdigest()
if cli_hmac == servar_hmac:
conn.send("支付成功~".encode())
else:
conn.send("滚~".encode())
servar = socketserver.ThreadingTCPServer(("127.0.0.1",3452),MyServer)
servar.serve_forever()
# 模拟合作服务端
import socket,hmac
# 密语
miyu = "夜袭寡妇村"
sk = socket.socket()
sk.connect(("127.0.0.1",3452))
auth_code = sk.recv(128)
hn = hmac.new(auth_code,miyu.encode())
msg = hn.hexdigest()
sk.send(msg.encode())
print(sk.recv(1024).decode())
sk.close()