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 socket import hmac # 该模块与hashlib类似 import os def 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 socket import hmac secret_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()
原文地址:https://www.cnblogs.com/whylinux/p/9749883.html
时间: 2024-10-28 13:04:50