1.服务端
# 验证客户端是否合法# 不依靠登陆认证# 当有一个客户端访问你的时候,建立了tcp后,server端主动发起一个数据,数据为想加密的bytes类型的数据。 # 客户端拿到要加密的bytes类型的数据,# import hmac # 该模块与hashlib类似# import os## h = hmac.new() # secret_key 需要一个密钥,与想要加密的bytes类型数据# content = h.digest() # 拿到一个密文内容# hmac.compare_digest() # 比较 ,密文与另外一个密文## print(os.urandom(32)) # 随机生成32个字节import socketimport hmac # 该模块与hashlib类似import osdef check_conn(conn): random_msg = os.urandom(32) # 得到一个随机的32个字节 conn.send(random_msg) # 随机发送32个字节 h = hmac.new(secret_key, random_msg) # 使用密钥secret_key对发送出去的32个随机字节进行加密得到一个hmac对象 digest = h.digest() # 由hmac对象得到一个密文 client_digest = conn.recv(1024) return hmac.compare_digest(digest, client_digest) # 比较自己对32个字节加密后得到的密文,与客户端得到32个字节后加密得到的密文是否一样secret_key = b'egg' # 密钥sk = socket.socket()sk.bind(('127.0.0.1', 8090))sk.listen()conn, addr = sk.accept()res = check_conn(conn)if res: print('合法的客户端') conn.send(b'OK')else: print('不合法的客户端') conn.send(b'NO')conn.close()sk.close()
客户端
import socketimport hmacsecret_key = b'egg'sk = socket.socket()sk.connect(('127.0.0.1', 8090))msg = sk.recv(1024) # 得到的是的32个随机字节h = hmac.new(secret_key, msg) # 根据与服务端协商好的secret_key,对收到的32个随机字节进行加密,得到一个hmac对象digest = h.digest() # 由hmac对象得到了32随机字节与secret_key加密后的密文内容sk.send(digest) # 将密文内容发送到服务端print(sk.recv(1024).decode('utf-8'))sk.close()