TCP合法登入

江寒雨發表於2024-03-22

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()

相關文章