33、验证客户端的合法性、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,因为客户端不需要有多个客户端发过来的消息。客户端还是一样进行收发操作。

原文地址:https://www.cnblogs.com/wyx666/p/8387090.html

时间: 2024-10-18 02:22:11

33、验证客户端的合法性、socketserver模块的相关文章

验证客户端链接以及socketserver模块

1 服务端套接字函数 2 s.bind() 绑定(主机,端口号)到套接字 3 s.listen() 开始TCP监听 4 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 5 6 客户端套接字函数 7 s.connect() 主动初始化TCP服务器连接 8 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 9 10 公共用途的套接字函数 11 s.recv() 接收TCP数据 12 s.send() 发送TCP数据 13 s.

验证客户端的合法性:

通常会用hmac模块,和hashlib中的加盐加密算法类似 服务器端提前和客户端约定好key  ,然后可以用os模块里的urandom来生成一组随机的字节 把随机字节发送给客户端去加密处理 ,服务器加密处理后把得到的字节与客户端传过来的进行比较 相同为true则合法 不同则非法 实现代码: 服务端 1 import os 2 import hmac 3 sk=socket.socket() 4 sk.bind(('127.0.0.1',8080)) 5 sk.listen() 6 key=b'd

socketserver和socket的补充(验证客户端合法性)

一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系列应为AF_INET(默认值ipv4),AF_INET6(ipv6),AF_UNIX,AF_CAN或AF_RDS. (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为SOCK_STREAM(默认值,tcp协议),SOCK_DGRAM(udp协议),SOCK_R

网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,"报头"部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                      udp头                            数据                                            tcp协议(流式协议) 2.udp协议的特点 (1)传输数据以数据报的形

Python全栈开发--socketserver模块和验证客户端链接的合法性

验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_auth(conn): ''' 认证客户端链接 :param conn: :return: ''' print('开始验证新链接的合法性') msg=os.urandom(32) conn.sendall(msg) h=

《Python》网络编程之验证客户端链接的合法性、socketserver模块

一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接,(阻塞式)等待连接的到来 # 客户端套接字函数 s.connect() # 主动初始化TCP服务器连接 s.connect_ex() # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 # 公共用途的套接字函数 s.recv() # 接收TCP数据 s.send() # 发送TC

SocketServer模块,hmac模块验证client合法性

hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 = h.digest() # hmac.compare_digest() #括号内传另外一个密文,看是否相等 h = hmac.new(b'secret',b'382835896') digest = h.digest() print(digest) #>>>> b'\xa4<

网络---29 socketserver模块并发 连接合法性

一.socketserver模块 ②服务端 ③客户端 二.连接合法性       ①os.urandom(n) 一种bytes类型的随机生成n个字节字符串的方法 而且每次生成的值都不相同.再加上md5等加密的处理 就能够成内容不同长度相同的字符串了. ②hmac ③ 可见使用hmac和普通hash算法非常类似. hmac输出的长度和原始哈希算法的长度一致. 需要注意传入的key和message都是bytes类型, str类型需要首先编码为bytes. 原文地址:https://www.cnblo

并发编程之socketserver模块

一.socketserver模块介绍 基于tcp套接字,关键的就是两个循环,一个是链接循环,一个是通信循环 socketserver模块中分两大类:srever类(解决链接问题)和request类(解决通信问题) 源码分析总结: 基于tcp的socketserver我们自己定义的类中 1.    self.server即套接字对象 2.    self.request即一个链接 3.    self.client_address即客户端地址 基于udp的socketserver我们自己定义的类中