加载中...

TCP合法登录

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()
posted @ 2024-03-22 00:29  江寒雨  阅读(50)  评论(0)    收藏  举报