TCP合法登录
服务端
# ### 服务端
""" 机器和机器之间的数据直接对接 """
import socketserver
import hmac
import os
class MyServer(socketserver.BaseRequestHandler):
secret_key = "小兔儿乖乖,把门开开"
def auth(self):
conn = self.request
# 创建一个随机的32位字节流
msg = os.urandom(32)
# 把字节流发送给客户端
conn.send(msg)
# 服务端进行数据校验
hm = hmac.new( self.secret_key.encode() , msg )
ser_res = hm.hexdigest()
# 服务端接受客户端发送过来的数据结果
cli_res = conn.recv(1024).decode()
# 进行比对,如果ok 返回True , 反之亦然
return True if ser_res == cli_res else False
def handle(self):
# 执行验证 判断是否合法
if self.auth():
self.request.send("True".encode())
else:
self.request.send("False".encode())
server = socketserver.ThreadingTCPServer( ("127.0.0.1" , 9000) , MyServer )
# 开启,让一个端口绑定多个程序; 模块.类.属性 = True
# socketserver.TCPServer.allow_reuse_address = True
server.serve_forever()
客户端
# ### 客户端
""" 机器和机器之间的数据直接对接 """
import socket
import hmac
sk = socket.socket()
sk.connect( ("127.0.0.1" , 9000) )
def auth(secret_key):
# 接受服务端发送过来的随机二进制字节流
msg = sk.recv(32)
# hmac.new( key(字节流) , 要加密的内容(字节流) )
hm = hmac.new( secret_key.encode() , msg )
# 返回的是具有固定32位长度的十六进制字符串
cli_res = hm.hexdigest()
# 把最后计算的结果发送给服务端进行校验
sk.send( cli_res.encode() )
# 接受服务端给予的校验结果
res = sk.recv(1024).decode()
return res
# 处理收发数据的逻辑
secret_key = "不开,老妈没回来"
secret_key = "小兔儿乖乖,把门开开"
# 调用授权函数
res = auth(secret_key)
if res == "True":
print("服务器校验通过")
else:
print("服务器校验失败")
sk.close()