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