前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day33 - hmac合法性检验以及socketserver的使用(多客户端)

day33 - hmac合法性检验以及socketserver的使用(多客户端)

原创
作者头像
少年包青菜
修改2020-12-14 11:44:07
5990
修改2020-12-14 11:44:07
举报
文章被收录于专栏:Python 学习Python 学习

1.hmac检查合法的客户端,本质上是检查是客户端否含有合法的秘钥

os.urandom(32) # 生成随机 bytes

hmac.new(secret_key, bytes_to_client, digestmod='md5').digest() # 服务器本地加密随机 bytes

hmac.compare_digest(bytes_from_client, local_secret_bytes) # 对比客户端加密结果判断

server端.py

代码语言:javascript
复制
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()

client端.py

代码语言:javascript
复制
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()

2.基于多线程(多个客户端)的服务端,客户端是一样的,这里就不写了

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.hmac检查合法的客户端,本质上是检查是客户端否含有合法的秘钥
    • server端.py
      • client端.py
      • 2.基于多线程(多个客户端)的服务端,客户端是一样的,这里就不写了
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档