• 七. 网络编程(验证客户端合法性 hmac模块)


    一. 验证客户端合法性 hmac模块

    Python内置的hmac模块实现了标准的Hmac算法,

    它利用一个key对message计算“杂凑”后的hash,

    使用hmac算法比标准hash算法更安全,因为针对相同的message,不同的key会产生不同的hash。


    import
    os aa=os.urandom(32) print(type(aa),aa) print("*******************************************************888") import hmac message = b'Hello world' key = b'secret' h = hmac.new(key,message,digestmod="md5") # 第一个参数是密钥key,第二个参数是待加密的字符串,第三个参数是hash函数 print(h.hexdigest()) print("*******************************************************888") 检测 一下客户端是否合法 不依靠登陆认证 import hmac h=hmac.new() # secret_key 你想进行加密的bytes 密文=h.digest() # 密文 # 返回摘要,作为二进制数据字符串值 hmac.compare_digest() # 对比 密文 另外一密文

    1.验证客户端合法性

    server
    
    import os
    import hmac
    import socket
    secret_key=b'lover'
    sk=socket.socket()
    sk.bind(('127.0.0.1',8600))
    sk.listen()
    
    def chek(conn):
        msg=os.urandom(32)
        conn.send(msg)
        h=hmac.new(secret_key,msg)
        dige=h.digest()
    
        client_dige=conn.recv(1024)
    
        return hmac.compare_digest(dige,client_dige)
    
    conn,addr=sk.accept()
    
    res=chek(conn)
    if res:
        print("合法的客服端")
        conn.close()
    else:
        print("不合法的客服端")
        conn.close()
    client
    
    import hmac
    import socket
    secret_key=b'lover'
    sk=socket.socket()
    sk.connect(('127.0.0.1',8600))
    msg
    =sk.recv(1024) h=hmac.new(secret_key,msg) dige=h.digest() sk.send(dige)

     案例

    server   
    
    from socket import *
    ip_prot=("192.168.59.1",8600)
    import hmac
    import  os
    res_key=b"lover"
    def server_hma(conn):
        msg=os.urandom(32)
        conn.sendall(msg)
        h= hmac.new(res_key,msg)
        dis=h.digest()
        req=conn.recv(len(dis))
        cc=hmac.compare_digest(req,dis)
        return cc
    
    def server_conn(conn):
        while True:
           if not  server_hma(conn):
             print("这是不符合")
             break
           else:
              date = conn.recv(1024)
              if not date:
                  break
              conn.sendall(date.upper())
    
    
    def server_head(ip_prot):
           server=socket(AF_INET,SOCK_STREAM)
           server.bind(ip_prot)
           server.listen(5)
           conn,addr=server.accept()
           server_conn(conn)
    
    server_head(ip_prot)
    client    合法客服端
    
    from socket import *
    import hmac
    ip_prot=("192.168.59.1",8600)
    import hmac
    import  os
    res_key=b"lover"
    def client_hm(client):
        msg=client.recv(32)
        h=hmac.new(res_key,msg)
        dis=h.digest()
        client.sendall(dis)
    def client_head(ip):
        client=socket(AF_INET,SOCK_STREAM)
        client.connect(ip)
        client_hm(client)
        while True:
            aa=input("》》》").strip()
            if not aa: continue
            client.sendall(aa.encode("utf-8"))
            bb=client.recv(1024)
            print(bb.decode("utf-8"))
    
    client_head(ip_prot)
    cliinet 非法客服端(没有验证)
    
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    from socket import *
    
    def client_handler(ip_port,bufsize=1024):
        tcp_socket_client=socket(AF_INET,SOCK_STREAM)
        tcp_socket_client.connect(ip_port)
    
        while True:
            data=input('>>: ').strip()
            if not data:continue
            if data == 'quit':break
    
            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)
        bufsize=1024
    clinet 非法客户端 不知道key
    
    __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)
        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_socket_client.connect(ip_port)
    
        conn_auth(tcp_socket_client)
    
        while True:
            data=input('>>: ').strip()
            if not data:continue
            if data == 'quit':break
    
            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)
        bufsize=1024
        client_handler(ip_port,bufsize)
    
    
  • 相关阅读:
    Oracle解除死锁
    观察者模式
    观察者模式
    第一个go程序
    第一个go程序
    Jersey处理表单Post信息
    Jersey处理表单Post信息
    JS获取操作系统及浏览器信息
    JS获取操作系统及浏览器信息
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/Sup-to/p/11141417.html
Copyright © 2020-2023  润新知