在某些情况下需要校验客户端的合法性,, 不是本程序的client 不能连接server 可以做下简单的校验合法性
原理: 客户端和服务端有一个相同的key 后, 服务端将要发送信息msg发送给client 端, 对 msg 和key进行加密, client 接收到msg 后也将msg 和key 进行加密后的client_digest发回给server端, server对自己算的digest 和 client端的client_digest 进行对比 ,相同则是合法的客户端,否则不是
可以利用内置模块 hmac 模块来进行加密校验 和 halib 差不多
用到的方法有:
创建hmac对象 h = hmac.new(key,msg) key和msg 都必须为byets 类型的
加密: h.digest()
对比结果: hmac.compare_digest(digest, client_digest)
server端:
import socket import hmac import os secret_key = b'key' sk = socket.socket() sk.bind(('127.0.0.1',6789)) sk.listen() #对连接的客户端校验时候合法 '''使用hmac 模块校验(内置模块)''' def check_conn(conn): msg = os.urandom(32) conn.send(msg)#随发送一个32位的字节数据,加密的bytes h = hmac.new(secret_key,msg) digest = h.digest()#加密后的digest client_digest =conn.recv(1024)#接收client发过来的加密digest ret = hmac.compare_digest(digest,client_digest)#对比接收到的client 的和server是否一致 return ret conn, addr = sk.accept() res = check_conn(conn) if res: print('合法的客户端') conn.close() else: print('bu合法的客户端') conn.close() sk.close()
client端:
import socket import hmac secret_key = b'key111' sk =socket.socket() sk.connect(('127.0.0.1',6789)) msg = sk.recv(1024) h = hmac.new(secret_key,msg) digest = h.digest() sk.send(digest) sk.close()