os.urandom(32) # 生成随机 bytes
hmac.new(secret_key, bytes_to_client, digestmod='md5').digest() # 服务器本地加密随机 bytes
hmac.compare_digest(bytes_from_client, local_secret_bytes) # 对比客户端加密结果判断
import os
import socket
import hmac
socket_obj = socket.socket()
socket_obj.bind(('localhost', 8000))
socket_obj.listen(1024)
connection, address = socket_obj.accept()
# 给客户端发送一个随机的 32 位的 bytes
bytes_to_client = os.urandom(32)
connection.send(bytes_to_client)
secret_key = b'leon'
# 将发给客户端的随机 bytes 加密,得到一个加密对象
secret_bytes_obj = hmac.new(secret_key, bytes_to_client, digestmod='md5')
# 调用 .digest() 获的加密后的 bytes
local_secret_bytes = secret_bytes_obj.digest()
# 接收到从客户端返回的 加密 bytes
bytes_from_client = connection.recv(1024)
# .compare_digest(),检查是否等同
if hmac.compare_digest(bytes_from_client, local_secret_bytes):
response = '合法客户端'
else:
response = '非法客户端'
print(response)
connection.close()
socket_obj.close()
import socket
import hmac
socket_obj = socket.socket()
socket_obj.connect(('localhost', 8000))
bytes_from_server = socket_obj.recv(1024)
# print(bytes_from_server)
# 秘钥
secret_key = b'leon'
# 将从服务器获得随机 32 位的 bytes 使用秘钥加密再返回给服务端
# 本质是为了检查是不是合法的客户端
# 如果你拥有我的 秘钥,则基本就是合法的
# 获取加密对象
secret_bytes_obj = hmac.new(secret_key, bytes_from_server, digestmod='md5')
# 调用 .digest() 获的加密后的 bytes
bytes_to_server = secret_bytes_obj.digest()
socket_obj.send(bytes_to_server)
socket_obj.close()
import socketserver # 导入这个专用模块
class MyServer(socketserver.BaseRequestHandler): # 这里注意继承socketserver的类
def handle(self):
while True:
msg = self.request.recv(1024).decode('utf-8')
print(msg)
info = input('>>>')
self.request.send(bytes(info, encoding='utf-8'))
server = socketserver.ThreadingTCPServer(('localhost', 8090), MyServer) # 这里接受两个参数,ip&端口,还有定义的类的名字
server.serve_forever() # 代表启动该服务
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。