zoukankan      html  css  js  c++  java
  • Python中Socket编程server与client简单的合法性认证

    导入python自带的hmac模块对随机生成的位数32字节和自定义token进行加密处理

    import os
    msg = os.urandom(32)  #随机生成
    msg
    Out[4]: b"F5xfaDx19xfc]x0f '>V/xf8x08}x1fx1axefRxdcx08xd6Qx1e3 Txe4Jx08xcf"

    Server端处理:

       a. 服务端产生一个新的连接,对客户端发送一个32位字符串

       b. hmac对token加密处理后接受客户端返回值进行比较

    from socket import *
    import hmac,os
    
    my_token = b'louis_swift'
    
    """
        validate the connection
    """
    
    
    def conn_auth(conn):
        print('validating connection...')
        msg = os.urandom(32)
        conn.sendall(msg)
        h = hmac.new(my_token, msg)
        digest = h.digest()
        response = conn.recv(len(digest))
        return hmac.compare_digest(response, digest)
    
    
    def data_handler(conn, bufsize=1024):
        if not conn_auth(conn):
            print('Invalid connection')
            conn.close()
            return
        while True:
            data = conn.recv(bufsize)
            if not data:
                break
            conn.sendall(data.upper())
    
    
    def server_handler(ip_port, bufsize, back_log=5):
        socket_tcp_server = socket(AF_INET, SOCK_STREAM)
        socket_tcp_server.bind(ip_port)
        socket_tcp_server.listen(back_log)
    
        while True:
            conn, addr = socket_tcp_server.accept()
            data_handler(conn, bufsize)
    
    
    if __name__ == '__main__':
        ip_port = ('127.0.0.1', 8080)
        bufsize = 1024
        server_handler(ip_port, bufsize)

    Client端处理:

      接收服务端的返回值进行hmac加密处理后再发送给服务端进行校验

    from socket import *
    import hmac,os
    
    my_token = b'louis_swift'
    
    
    def conn_auth(conn):
        msg = conn.recv(32)
        h = hmac.new(my_token, msg)
        digest = h.digest()
        conn.send(digest)
    
    
    def client_handler(ip_port, bufsize=1024):
        socket_tcp_client = socket(AF_INET, SOCK_STREAM)
        socket_tcp_client.connect(ip_port)
        conn_auth(socket_tcp_client)
    
        while True:
            data = input('>>: ').strip()
            if not data:
                continue
            if data == 'quit':
                break
            socket_tcp_client.sendall(data.encode('utf-8'))
            response = socket_tcp_client.recv(bufsize)
            print('response data from server:', response)
        socket_tcp_client.close()
    
    
    if __name__ == '__main__':
        ip_port = ('127.0.0.1', 8080)
        bufsize = 1024
        client_handler(ip_port, bufsize)
  • 相关阅读:
    => 运算符
    ASP.NET与Javascript中获取URL信息
    ASP.NET中存取图片到数据库的示例
    在C#中利用DirectX实现声音播放
    使用VS2005 DataSet设计器实现数据访问层
    用C#播放声音文件
    VB.NET中声音的播放
    用C#播放声音文件
    声音播放解决方案(C#)
    Asp.Net音频文件上传和播放
  • 原文地址:https://www.cnblogs.com/louiszh/p/12391646.html
Copyright © 2011-2022 走看看