Python网络编程基础 ❹ hmac的检验客户端合法性 socketserver模块
1、hmac模块验证客户端合法性
1)demo
1 import hmac 2 3 # hmac模块使用演示 4 5 secret_key = b'hongsun' 6 content = b'hello python hmac' 7 h = hmac.new(secret_key,content) 8 digest = h.digest() 9 10 print(digest) 11 ''' 12 密文: 13 b'\xf4\xd7!\xf7\xaeaI\xb0\x1c\xca\x17R\xac\xe6\xc5\xad' 14 ''' 15 16 result = hmac.compare_digest(digest, b'\xf4\xd7!\xf7\xaeaI\xb0\x1c\xca\x17R\xac\xe6\xc5\xad') 17 print('是不是一样?', result)
2)实际测试
(1)服务器端
1 import socket,hmac,os 2 3 secret_key = b'funyou' 4 5 6 def check_conn(conn): 7 msg = os.urandom(32) 8 conn.send(msg) 9 h = hmac.new(secret_key, msg) 10 code = h.digest() 11 re_code = conn.recv(1024) 12 return hmac.compare_digest(code, re_code) 13 14 15 sk = socket.socket() 16 sk.bind(('127.0.0.1', 8888)) 17 sk.listen() 18 conn, addr = sk.accept() 19 20 if check_conn(conn): 21 print('合法的客户端!') 22 else: 23 print('不合法的客户端!') 24 25 conn.close() 26 sk.close()
(2)客户端
1 import socket,hmac,os 2 3 secret_key = b'funyou' 4 5 6 def check_conn(conn): 7 msg = os.urandom(32) 8 conn.send(msg) 9 h = hmac.new(secret_key, msg) 10 code = h.digest() 11 re_code = conn.recv(1024) 12 return hmac.compare_digest(code, re_code) 13 14 15 sk = socket.socket() 16 sk.bind(('127.0.0.1', 8888)) 17 sk.listen() 18 conn, addr = sk.accept() 19 20 if check_conn(conn): 21 print('合法的客户端!') 22 else: 23 print('不合法的客户端!') 24 25 conn.close() 26 sk.close()
2、socketserver模块
1)、demo:服务器端
1 import socketserver 2 3 4 class ServerDemo(socketserver.BaseRequestHandler): 5 def handle(self): 6 while 1: 7 msg = self.request.recv(1024).decode('utf-8') 8 print(msg) 9 if msg == 'q': 10 self.request.send(b'q') 11 self.request.close() 12 break 13 ipt = input('>>>').encode('utf-8') 14 self.request.send(ipt) 15 print('阻塞在此') # 因为是多线程的,而且开启了永久服务! 16 17 if __name__ == '__main__': 18 server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), ServerDemo) 19 server.serve_forever()
客户端代码
1 import socket 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 8888)) 5 while 1: 6 ipt = input('>>>').encode('utf-8') 7 sk.send(ipt) 8 msg = sk.recv(1024).decode('utf-8') 9 if msg == 'q': 10 sk.send(b'q') 11 break 12 print(msg) 13 14 sk.close()
2)、应用:socketserver模拟登陆
(1)服务器端
1 import socketserver,struct,json 2 3 ''' 4 登录服务器 5 ''' 6 7 class LoginServer(socketserver.BaseRequestHandler): 8 9 def check_login(self, name, pwd): 10 ''' 11 检验登录是否合法 12 :param name: 用户名 13 :param pwd: 密文密码 14 :return: 是否合法 15 ''' 16 with open('user_info', encoding='utf-8') as f: 17 lines = f.readlines() 18 for line in lines: 19 info_li = line.split('|') 20 if info_li[0] == name and info_li[1] == pwd: 21 return True 22 else: 23 return False 24 25 def handle(self): 26 while 1: 27 length_msg = self.request.recv(4) 28 length = struct.unpack('i', length_msg)[0] 29 print(length) 30 data = self.request.recv(length).decode('utf-8') 31 content = json.loads(data) 32 print(data) 33 result = self.check_login(content[ 'name' ], content[ 'pwd' ]) 34 print(result) 35 if result: 36 self.request.send(b'1') 37 break 38 else: 39 self.request.send(b'0') 40 continue 41 42 if __name__ == '__main__': 43 server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), LoginServer) 44 server.serve_forever()
(2)客户端
1 import socket, hashlib, json, struct 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 8080)) 5 6 7 def login(name, pwd): 8 ''' 9 发送登录数据给服务器 10 :param name: 用户输入的密码 11 :param pwd: 用户输入的密码 12 :return: 是否登录成功 13 ''' 14 # 先使用摘要算法加密密码 15 md5 = hashlib.md5() 16 md5.update(pwd.encode('utf-8')) 17 secret_pwd = md5.hexdigest() 18 19 # 将要传送的数据打包成字典 20 data = {'name': name, "pwd": secret_pwd} 21 22 # 使用json序列化数据包 23 data_json = json.dumps(data) 24 25 # 使用struct将数据包长度发送过去,避免黏包 26 data_length = struct.pack('i', len(data_json)) 27 sk.send(data_length) 28 sk.send(data_json.encode('utf-8')) 29 30 result = sk.recv(4).decode('utf-8') 31 if result == '1': 32 return True 33 else: 34 return False 35 36 37 while 1: 38 name = input('请输入登录名:》》》').strip() 39 pwd = input('请输入登录密码:》》》').strip() 40 41 if login(name, pwd): 42 print('登陆成功,可以发数据了!') 43 break 44 else: 45 print('登陆失败,请重新登录!') 46 continue 47 48 sk.close()
(3)读取的数据 user_info
tom|202cb962ac59075b964b07152d234b70|teacher jack|250cf8b51c773f3f8dc8b4be867a9a02|admin cindy|250cf8b51c773f3f8dc8b4be867a9a02|student

浙公网安备 33010602011771号