客户端的安全性验证
客户端的安全性验证,这个需求在于,当别人连接你的服务端的时候,验证他的身份
不可能是哪个客户端想连就能连接,这时候就需要验证了
import os import hmac #调用hmac模块 import socket secret_key = b'eve' #secret_key 密钥 sk = socket.socket() sk.bind(('127.0.0.1',8088)) sk.listen() def check_conn(conn): msg = os.urandom(32) #调用os模块 生成一个32位的字节 conn.send(msg) #将这串字节传给客户端 h = hmac.new(secret_key,msg) digest = h.digest() client_digest = conn.recv(1024) return hmac.compare_digest(digest,client_digest) conn,addr = sk.accept() res = check_conn(conn) if res: print('合法的客户端') conn.close() else: print('不合法的客户端') conn.close() sk.close()
import hmac import socket secret_key = b'eve' sk = socket.socket() sk.connect(('127.0.0.1',8088)) msg = sk.recv(1024) h = hmac.new(secret_key,msg) digest = h.digest() sk.send(digest) sk.close()
这段代码所做的就是,设定一个密钥,然后调用hmac模块
生成一个32位的字节并传给客户端
客户端经过加密后再将密钥与加密后的字节传回来
服务端也将直接进行加密,然后加上密钥
与客户端传过来的进行对比,如果相同就是合法的客户端
如果不相同 就是不合法的客户端
当然,并不是只能用hmac来进行加密,还有很多其它的算法可以用来摘要加密
服务端对客户端的多端连接
import socketserver #调用socketserver模块 class MyServer(socketserver.BaseRequestHandler): def handle(self): # self.request 就相当于一个conn while True: #这些是平常交互的代码 print(self.client_address) msg = self.request.recv(1024).decode('utf-8') if msg == 'q':break print(msg) info = input('>>>') self.request.send(info.encode('utf-8')) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',8088),MyServer) #创建一个Server 将服务地址绑定到127.0.0.1 server.allow_reuse_address = True # 允许服务器重用地址 #端口号是8088 server.serve_forever() #开启服务
import socket sk = socket.socket() #client端就是平常的交互就行了 sk.connect(('127.0.0.1',8088)) while True: msg = input('>>>') if msg == 'q': sk.send(b'q') break sk.send(msg.encode('utf-8')) ret = sk.recv(1024).decode('utf-8') print(ret) sk.close()
这样 就能实现服务端对客户端的多端交互
而且,还可以将验证和多端连接结合起来使用,实现一个一对多的聊天室