python学习笔记 day33 验证客户端的合法性 hmac模块
1. 验证客户端的合法性
# server.py import socket import hmac import os secret_key=b"xuanxuan" # 设置密钥,通讯双方肯定首先约定好的,其他的不知道这个约定密钥的肯定连不上server sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(("127.0.0.1",8080)) sk.listen() conn, addr = sk.accept() def check_conn(conn): msg=os.urandom(32) # os.urandom(32)可以随机发送32位的字节(bytes类型),原理就是服务端利用密钥和msg使用hmac进行加密,把msg发给client # 如果client知道密钥,client端也对密钥和msg使用hmac加密,server端对比这两个加密后的结果,如果一致,则允许client端连接 conn.send(msg) # 服务端给客户端发送需要加密的对象msg,密钥是secret_key 如果client端事先知道约定的密钥,则使用hmac进行加密的结果一定是相同的 h=hmac.new(secret_key,msg) # hmac.new()用于指定需要后续加密的对象:secret_key 和 msg,两者都是bytes类型 digest=h.digest() # 进行加密 client_digest=conn.recv(1024) # 客户端对secret_key 和 msg使用hmac进行加密,把加密后的结果返回 return hmac.compare_digest(digest,client_digest) res=check_conn(conn) if res: conn.send(bytes("你好,客户端,我是服务器,你通过我的验证了,我们可以进行通话了".encode("utf-8"))) ret=conn.recv(1024).decode("utf-8") print(ret) conn.close() else: print("客户端不合法,我不要和你通信,我要关闭连接") conn.close() sk.close()
# client.py import socket import hmac secret_key=b"xuanxuan" # 合法的客户端,肯定知道它要连接的server端的密钥 sk=socket.socket() sk.connect(("127.0.0.1",8080)) msg=sk.recv(1024) # 接收server端发送来的msg 需要对msg进行加密(双方还有个密钥) h=hmac.new(secret_key,msg) # hmac.new()指定需要加密的对象 msg 和 密钥 client_digest=h.digest() sk.send(client_digest) ret=sk.recv(1024).decode("utf-8") # 如果客户端不合法,服务端打印”客户端不合法“然后直接中断连接 print(ret) # 如果客户端合法,就会收到server端的send()信息,可以正常通信了 sk.send(bytes("哈哈哈,好的,信息已收到~".encode("utf-8"))) # client端收到server端的send之后,给server端回一个收到啦 sk.close()
运行结果:
talk is cheap,show me the code
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!