一.socketserver模塊 1.sockeserver的源碼流程 2.簡單的使用 socketserver服務端 socket客戶端 二.連接的合法性驗證 1.os.urandom(n)加密 os.urandom(n)是一種bytes類型的隨機生成n個位元組字元串,而且每次生成的值都不相同,再加 ...
一.socketserver模塊
2.簡單的使用
socketserver服務端
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): msg = self.request.recv(1024) print(msg) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer) # 實例化對象 server.serve_forever()
socket客戶端
import socket client = socket.socket() ip_port = ("127.0.0.1",8888) client.connect(ip_port) client.send(b"hello")
二.連接的合法性驗證
1.os.urandom(n)加密
os.urandom(n)是一種bytes類型的隨機生成n個位元組字元串,而且每次生成的值都不相同,再加上md5等加密處理,九懲了內容不同長度相同的字元串了
2.hmac
python自帶的hmac模塊實現了標準的Hmac演算法
import hmac
message = b'Hello world' # 加密信息
key = b'secret' # 加密密匙
h = hmac.new(key,message,digestmod='MD5') # 密匙,信息,模式
print(h.hexdigest())
比較兩個密文是否相同,可以用hmac.compare_digest(密文、密文),然會True或者False。
3.連接合法性驗證服務端和客戶端
服務端
import socket import hmac , os secret_key = b"This is key!" # 只做驗證 返回bool def conn_auth(conn): print("連接認證") msg = os.urandom(32) conn.send(msg) h = hmac.new(secret_key,msg) server_key = h.digest() client_key = conn.recv(32) # print(server_key,client_key) return hmac.compare_digest(server_key,client_key) # 判斷驗證 def data(conn): if conn_auth(conn): print("驗證成功!") conn.send("驗證成功".encode("utf-8")) while 1: data = conn.recv(1024) print(data) else: print("驗證失敗") conn.send("驗證失敗".encode("utf-8")) conn.close() return # 啟動 def tcp_server(ip_port,): server = socket.socket() server.bind(ip_port) server.listen() while 1: conn,addr = server.accept() print(f"新連接: {addr[0]}:{addr[1]}") data(conn) if __name__ == '__main__': ip_port = ("127.0.0.1",8888) tcp_server(ip_port)View Code
客戶端
import socket import os, hmac # 密匙 sercet_key = b"This is key!" # 使用密匙驗證連接是否合法 def conn_auth(client): msg = client.recv(32) h = hmac.new(sercet_key, msg) client_key = h.digest() client.send(client_key) # 驗證判斷 def tcp_client(ip_port): client = socket.socket() client.connect(ip_port) conn_auth(client) verify = client.recv(12).decode("utf-8") while verify == "驗證成功": data = input("給服務端發送:").encode("utf-8") client.send(data) else: print("連接被拒絕") client.close() if __name__ == '__main__': ip_port = ("127.0.0.1", 8888) tcp_client(ip_port)View Code