socketserver模块实现并发和连接合法性验证
2019-01-08 08:24:05来源:博客园 阅读 ()
一.socketserver模块
1.sockeserver的源码流程
2.简单的使用
socketserver服务端
import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): msg = self.request.recv(1024) print(msg) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer) # 实例化对象 server.serve_forever()
socket客户端
import socket client = socket.socket() ip_port = ("127.0.0.1",8888) client.connect(ip_port) client.send(b"hello")
二.连接的合法性验证
1.os.urandom(n)加密
os.urandom(n)是一种bytes类型的随机生成n个字节字符串,而且每次生成的值都不相同,再加上md5等加密处理,九惩了内容不同长度相同的字符串了
2.hmac
python自带的hmac模块实现了标准的Hmac算法
import hmac
message = b'Hello world' # 加密信息
key = b'secret' # 加密密匙
h = hmac.new(key,message,digestmod='MD5') # 密匙,信息,模式
print(h.hexdigest())
比较两个密文是否相同,可以用hmac.compare_digest(密文、密文),然会True或者False。
3.连接合法性验证服务端和客户端
服务端
import socket import hmac , os secret_key = b"This is key!" # 只做验证 返回bool def conn_auth(conn): print("连接认证") msg = os.urandom(32) conn.send(msg) h = hmac.new(secret_key,msg) server_key = h.digest() client_key = conn.recv(32) # print(server_key,client_key) return hmac.compare_digest(server_key,client_key) # 判断验证 def data(conn): if conn_auth(conn): print("验证成功!") conn.send("验证成功".encode("utf-8")) while 1: data = conn.recv(1024) print(data) else: print("验证失败") conn.send("验证失败".encode("utf-8")) conn.close() return # 启动 def tcp_server(ip_port,): server = socket.socket() server.bind(ip_port) server.listen() while 1: conn,addr = server.accept() print(f"新连接: {addr[0]}:{addr[1]}") data(conn) if __name__ == '__main__': ip_port = ("127.0.0.1",8888) tcp_server(ip_port)
客户端
import socket import os, hmac # 密匙 sercet_key = b"This is key!" # 使用密匙验证连接是否合法 def conn_auth(client): msg = client.recv(32) h = hmac.new(sercet_key, msg) client_key = h.digest() client.send(client_key) # 验证判断 def tcp_client(ip_port): client = socket.socket() client.connect(ip_port) conn_auth(client) verify = client.recv(12).decode("utf-8") while verify == "验证成功": data = input("给服务端发送:").encode("utf-8") client.send(data) else: print("连接被拒绝") client.close() if __name__ == '__main__': ip_port = ("127.0.0.1", 8888) tcp_client(ip_port)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Python基本数据类型
下一篇:day 22 - 1 面向对象
- python day2-爬虫实现github登录 2019-08-13
- python3 enum模块的应用 2019-08-13
- 利用python自动生成verilog模块例化模板 2019-08-13
- python+selenium实现自动化百度搜索关键词 2019-07-24
- Python random模块(以后用到一个再更新一个) 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash