zoukankan      html  css  js  c++  java
  • socketv 验证客户端链接的合法性

    一 、socketv 验证客户端链接的合法性

     

    send()与sendall()

    验证客户端

    加密验证

    如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现

     服务器端

    #_*_coding:utf-8_*_
    from socket import *#引入套接字的所有模块
    import hmac,os#引入两个模块
    
    secret_key=b'linhaifeng bang bang bang'#是指一个固定字符串的key
    def conn_auth(conn):#定义函数认证客户端连接
        '''
        认证客户端链接
        :param conn:
        :return:
        '''
        print('开始验证新链接的合法性')#打印提示
        msg=os.urandom(32)#随机生成一个32位的数
        conn.sendall(msg)#连接发送这个随机的数
        h=hmac.new(secret_key,msg)#生成一个新的验证码
        digest=h.digest()#生成一个摘要
        respone=conn.recv(len(digest))#接收回应,连接接收摘要的长度
        return hmac.compare_digest(respone,digest)#回应一个摘要长度+摘要
    
    def data_handler(conn,bufsize=1024):#数据处理机函数(传入两个参数conn,和设置的默认大小)
        if not conn_auth(conn):#如果没有链接
            print('该链接不合法,关闭')#打印该链接不合法,关闭
            conn.close()#关闭链接
            return
        print('链接合法,开始通信')#链接合法,开始通信
        while True:#循环为真
            data=conn.recv(bufsize)#接收数据
            if not data:break#如果没有数据则打断
            conn.sendall(data.upper())#链接发送数据
    
    def server_handler(ip_port,bufsize,backlog=5):#服务器处理机ip和端口,设置大小
        '''
        只处理链接
        :param ip_port:
        :return:
        '''
        tcp_socket_server=socket(AF_INET,SOCK_STREAM)#实例化一个tcp的套接字
        tcp_socket_server.bind(ip_port)#绑定ip端口
        tcp_socket_server.listen(backlog)#监听
        while True:#循环为真
            conn,addr=tcp_socket_server.accept()#接收链接和地址
            print('新连接[%s:%s]' %(addr[0],addr[1]))#打印新连接ip和端口
            data_handler(conn,bufsize)#调用数据处理机函数
    
    if __name__ == '__main__':#如果当前用户名=用户名
        ip_port=('127.0.0.1',9999)#ip和端口
        bufsize=1024#设置字节大小
        server_handler(ip_port,bufsize)#服务器处理机得到的参数
    
    服务端

    客户端

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'#作者林海峰
    from socket import *#引入所有的套接字模块
    import hmac,os#引入hmac摘要和系统模块
    
    secret_key=b'linhaifeng bang bang bang'#设置一个字符串key
    def conn_auth(conn):#定义一个客户验证到服务器端的链接
        '''
        验证客户端到服务器的链接
        :param conn:
        :return:
        '''
        msg=conn.recv(32)#接受一个32位的信息
        h=hmac.new(secret_key,msg)#生成一个验证码
        digest=h.digest()#得到一个摘要
        conn.sendall(digest)#链接发送这个摘要
    
    def client_handler(ip_port,bufsize=1024):#顶一个客户端链接的函数
        tcp_socket_client=socket(AF_INET,SOCK_STREAM)#创建一个tcp套接字的对象
        tcp_socket_client.connect(ip_port)#链接ip和端口
    
        conn_auth(tcp_socket_client)#链接
    
        while True:#循环为真
            data=input('>>: ').strip()#输入内容
            if not data:continue#如果没有内容则跳过
            if data == 'quit':break#如果输入'quit'则打断
    
            tcp_socket_client.sendall(data.encode('utf-8'))#发送数据
            respone=tcp_socket_client.recv(bufsize)#接收数据
            print(respone.decode('utf-8'))#打印接收的数据
        tcp_socket_client.close()#关闭这个套接字
    if __name__ == '__main__':#如果用户名=当前用户名
        ip_port=('127.0.0.1',9999)#ip和接口
        bufsize=1024#设置大小为1024
        client_handler(ip_port,bufsize)#的到一个函数传入两个参数

     客户端(非法:不知道加密方式)

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'#作者林海峰
    from socket import *#引入伯克利套接字
    
    def client_handler(ip_port,bufsize=1024):#定义客户端处理机函数
        tcp_socket_client=socket(AF_INET,SOCK_STREAM)#实例化一个ftp套接字对象
        tcp_socket_client.connect(ip_port)#链接ip和端口
    
        while True:#循环为真
            data=input('>>: ').strip()#输入数据
            if not data:continue#如果没有剖数据则跳过
            if data == 'quit':break#如果输入'quit'则中断
    
            tcp_socket_client.sendall(data.encode('utf-8'))#发送数据
            respone=tcp_socket_client.recv(bufsize)#接收1024字节数据
            print(respone.decode('utf-8'))#打印这个回应
        tcp_socket_client.close()#关闭这个链接
    
    if __name__ == '__main__':#如果用户名=当前用户名
        ip_port=('127.0.0.1',9999)#ip和端口
        bufsize=1024#设置1024
        client_handler(ip_port,bufsize)#调用函数传入两个数

    客户端(非法:不知道secret_key)

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'#作者林海峰
    from socket import *#引入套接字模块
    import hmac,os#引入两个模块
    
    secret_key=b'linhaifeng bang bang bang1111'#设置一个固定的字符串钥匙
    def conn_auth(conn):#定义链接处理机函数
        '''
        验证客户端到服务器的链接
        :param conn:
        :return:
        '''
        msg=conn.recv(32)#接受一个32大小的数
        h=hmac.new(secret_key,msg)#生成一个bytes摘要
        digest=h.digest()#得到摘要
        conn.sendall(digest)#发送摘要
    
    def client_handler(ip_port,bufsize=1024):#客户端处理机函数
        tcp_socket_client=socket(AF_INET,SOCK_STREAM)#实例化一个tcp套接字
        tcp_socket_client.connect(ip_port)#链接这个ip和端口
    
        conn_auth(tcp_socket_client)#调用链接_处理机函数
    
        while True:#循环为真
            data=input('>>: ').strip()#输入你的内容
            if not data:continue#如果没有数据则跳过
            if data == 'quit':break#如果输入quit则退出
    
            tcp_socket_client.sendall(data.encode('utf-8'))#发送数据
            respone=tcp_socket_client.recv(bufsize)#接收1024大小的数据
            print(respone.decode('utf-8'))#打印这个数据
        tcp_socket_client.close()#关闭这个链接
    
    if __name__ == '__main__':#如果当前文件夹的用户名等于这个用户名
        ip_port=('127.0.0.1',9999)#ip和端口
        bufsize=1024#赋值1024
        client_handler(ip_port,bufsize)#使用客户端函数,传入两个参数

    二、socketserver

    解读socketserver源码 —— http://www.cnblogs.com/Eva-J/p/5081851.html 

    socketserver模块中包含了socket模块

    server端

    import socketserver#引入套接字服务器
    class Myserver(socketserver.BaseRequestHandler):#定义一个Myserver类继承socketserver.BaseRequestHandler
        def handle(self):#定义一个处理机方法
            self.data = self.request.recv(1024).strip()#对象的数据=接收的数据
            print("{} wrote:".format(self.client_address[0]))#{打印ip地址}写
            print(self.data)#打印接收的数据
            self.request.sendall(self.data.upper())#发送数据
    
    if __name__ == "__main__":#如果当前文件夹名字等于这个文件夹名字
        HOST, PORT = "127.0.0.1", 9999#主机和接口
    
        # 设置allow_reuse_address允许服务器重用地址
        socketserver.TCPServer.allow_reuse_address = True
        # 创建一个server, 将服务地址绑定到127.0.0.1:9999
        server = socketserver.TCPServer((HOST, PORT),Myserver)
        # 让server永远运行下去,除非强制停止程序
        server.serve_forever()

    client端

    import socket#引入套接字模块
    
    HOST, PORT = "127.0.0.1", 9999#主机ip和端口
    data = "hello"#数据=hello
    
    # 创建一个socket链接,SOCK_STREAM代表使用TCP协议
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((HOST, PORT))          # 链接到客户端
        sock.sendall(bytes(data + "
    ", "utf-8")) # 向服务端发送数据
        received = str(sock.recv(1024), "utf-8")# 从服务端接收数据
    
    print("Sent:     {}".format(data))#打印格式化数据
    print("Received: {}".format(received))#打印接收到的信息

    作业要求:

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    scala 时间,时间格式转换
    GIS基础知识
    客户端,Scala:Spark查询Phoenix
    Phoenix的shell操作
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8623951.html
Copyright © 2011-2022 走看看