• 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)
  • 相关阅读:
    C#中yield return用法分析
    SQL表连接查询(inner join(join)、full join、left join、right join、cross join)
    SQL Server 数据类型转换函数
    linq查询结果指定列的两种方式
    html2cavans
    ORM
    Node.js Web 模块
    Node.js GET/POST请求
    Node.js 文件系统
    装逼利器函数注释
  • 原文地址:https://www.cnblogs.com/louiszh/p/12391646.html
Copyright © 2020-2023  润新知