验证客户端的合法性、socketserver模块
一、为了防止客户端被人非法利用,需要在使用之前对客户端进行合法性验证。接下来就是客户端验证的几种方法
hmac 加密方法
import socket
import os
import hmac #能转化成密文模块
secret_key=b'apple' #密钥,必须是bytes类型
sk=socket.socket()
sk.bind(('127.0.0.1',8008))
sk.listen()
def check_con(con): #定义一个验证函数
msg=os.urandom(32) #系统模块中的urandom方法,可以生成指定位数的bytes数
con.send(msg)
h=hmac.new(secret_key,msg) #new方法:接收两盒变量:密钥和要加密的变量
digest=h.digest() #密文变量等于
client_digest=con.recv(1024) #接收到的密文
return hmac.compare_digest(digest,client_digest)#hmac模块compare_digest方法:比较两个密文是否一致。
con,addr=sk.accept()
res=check_con(con)
if res: #比较
print('合法的客户端')
con.close()
else:
print('不合法的客户端')
con.close()
sk.close()
#客户端
import socket
import hmac
secret_key=b'apple' #密钥:和服务端密钥要一致
sk=socket.socket()
sk.connect(('127.0.0.1',8008))
msg=sk.recv(1024)
h=hmac.new(secret_key,msg) #将接收到的信息进行加密
digest=h.digest() #得到密文变量
sk.send(digest) #将密文变量发送到服务端进行比较
sk.close()
客户端验证的总的思路是将服务端随机产生的指定位数的字节发送到客户端,两边同时用hmac进行加密,然后对生成的密文进行比较,相同就是合法的客户端,不相同就是不合法的端户端
二、socketserver模块:在socket模块的基础上加一层socket层,目的是让服务端可以处理多个线程,(能启动多个线程)。
服务端:
import socketserver
class MyServer(socketserver.BaseRequestHandler): #必须要继承(socketserver.BaseRequestHandler类
def handle(self): # self.request 就相当于一个conn #必须要有def handle(self)方法
while True:
print(self.client_address)
msg = self.request.recv(1024).decode('utf-8') #相当于conn.recv
if msg == 'q':break
print(msg)
info = input('%s>>>'%msg[:2])
self.request.send(info.encode('utf-8')) #相当于conn.recv方法 if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
# thread 线程
server.allow_reuse_address = True
server.serve_forever()
注:self.request:相当于conn,addr=sk.accept()中的conn。。。。。。。
客户端:
#客户端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg = input('>>>')
if msg == 'q':
sk.send(b'q')
break
sk.send(('美团 :'+msg).encode('utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
sk.close()
客户端没有socketclient,因为客户端不需要有多个客户端发过来的消息。客户端还是一样进行收发操作。
验证客户端的合法性、socketserver模块的更多相关文章
- Day 35 验证客户端的合法性+socketserver
一 .getpeername和getsoketopt的用法 服务器端代码 import socket sk =socket.socket() sk.bind(('127.0.0.1',9000)) s ...
- 总结day26 ----验证客户端的合法性,已经操作系统,进程的简单初识别
前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个clie ...
- python_网络编程hmac模块验证客户端的合法性
hmac模块: 比较两个函数的密钥是否一致: import hmac import os msg = os.urandom(32) #生成32位随机字节码 def wdc(): key = b'wdc ...
- python 验证客户端的合法性
目的:对连接服务器的客户端进行判断 # Server import socket import hmac import os secret_key = bytes('tom', encoding='u ...
- 用hmac验证客户端的合法性
服务器端程序 import os import hmac import socket def auth(conn): secret_key = b'rock' rand_b = os.urandom( ...
- socketserver和socket的补充(验证客户端合法性)
一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系 ...
- socketserver模块简介
1. socketserver模块简介 在python的socket编程中,实用socket模块的时候,是不能实现多个连接的,当然如果加入其 它的模块是可以的,例如select模块,在这里见到的介绍下 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
- 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用
基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...
随机推荐
- Maven 集成Tomcat插件(引用)
Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题.本文将介绍,Maven如何介绍Tomcat插件. Maven Tomcat插件现在主要 ...
- noscript
<noscript> <article id="noscript" class="error info_panel"> <head ...
- Python中queue消息队列模块
from queue import Queue from queue import PriorityQueue print("Queue类实现了一个基本的先进先出(FIFO)容器,使用put ...
- 211-基于FMC的ADC-DAC子卡
基于FMC的ADC-DAC子卡 一.板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集.1路2.5G DA回放的FMC.1路AD同步信号子卡.板卡采用标准FMC子卡架构 ...
- RABBITMQ 协议 AMQP协议
https://baike.baidu.com/item/rabbitmq/9372144?fr=aladdin https://github.com/CopernicaMarketingSoftwa ...
- thinkphp数据库连接
https://www.kancloud.cn/manual/thinkphp5/118059 一.配置文件定义 常用的配置方式是在应用目录或者模块目录下面的database.php中添加下面的配置参 ...
- LinkedList与ArrayList的区别(内部实现)
ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更像数组: LinkedList的内部实现是基于一组连接的记录,所以,它更像一个链表结构,所以,它们在性能上有很大的差别. ...
- RPC的解释以及RPC和Restful、RPC和RMI的区别
如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...
- php strtr()函数 语法
php strtr()函数 语法 作用:转换字符串中的某些字符直线电机生产厂家 语法:strtr(string,from,to)或者strtr(string,array) 参数: 参数 描述 stri ...
- 【LOMBOK】能引入 @Slf4j 注解,不能识别 log 的解决方法
问题: 在pom.xml中加入引入了lombok的依赖,可以引用@Slf4j注解不能识别log 如:注:上面一篇博客,已经说明lombok的安装了,但是用的时候还有点问题. 1).把lombok.ja ...