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

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

 

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

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

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

    (3)读取的数据 user_info

tom|202cb962ac59075b964b07152d234b70|teacher
jack|250cf8b51c773f3f8dc8b4be867a9a02|admin
cindy|250cf8b51c773f3f8dc8b4be867a9a02|student
posted @ 2019-12-20 22:35  四方游览  阅读(121)  评论(0)    收藏  举报