• 验证链接合法性(hmac)


    一种类似于哈希的加密方式,

    服务端建立连接后发送固定的随机数,客户端接收同样的随机数后,

    使用这串字符串与客户端的密匙生成hmac数据返回服务端,

    服务端自己也用hmac把随机数与服务端密匙生成数据

    两个数据用hmac模块的比较即可。

    服务端

     1 import hmac,os
     2 from socket import *
     3 
     4 secret_key = b'just do it'
     5 
     6 def conn_auth(conn):
     7     print('开始验证链接合法性')
     8     msg = os.urandom(32)
     9     conn.sendall(msg)
    10     h = hmac.new(secret_key,msg)
    11     digest = h.digest()
    12     respone = conn.recv(len(digest))
    13     return hmac.compare_digest(respone,digest)
    14 
    15 
    16 def data_handler(conn,bufsize):
    17     if not conn_auth(conn):
    18         print('该链接不合法,关闭')
    19         conn.close()
    20         return
    21     print('链接合法,开始通信')
    22     while True:
    23         data = conn.recv(bufsize)
    24         if not data:break
    25         conn.sendall(data.upper())
    26 
    27 
    28 def server_handlse(ip_port,bufsize,backlog=5):
    29     tcp_socket_server = socket(AF_INET,SOCK_STREAM)
    30     tcp_socket_server.bind(ip_port)
    31     tcp_socket_server.listen(backlog)
    32     while 1:
    33         conn,addr = tcp_socket_server.accept()
    34         print('产生新连接')
    35         data_handler(conn,bufsize)
    36 
    37 if __name__ == '__main__':
    38     ip_port = ('121.195.167.34',9999)
    39     bufsize = 1024
    40     server_handlse(ip_port,bufsize)

    客户端

     1 import hmac
     2 from socket import *
     3 
     4 secret_key = 'just do it'.encode('utf-8')
     5 
     6 def conn_auth(conn):
     7     msg = conn.recv(32)
     8     h = hmac.new(secret_key,msg)
     9     digest = h.digest()
    10     conn.sendall(digest)
    11 
    12 
    13 
    14 def client_handler(ip_port, bufsize):
    15     tcp_socket_client = socket(AF_INET,SOCK_STREAM)
    16     tcp_socket_client.connect(ip_port)
    17 
    18     conn_auth(tcp_socket_client)
    19 
    20     while True:
    21         data = input('>>>:').strip()
    22         if data == 'quit':
    23             break
    24         else:
    25             continue
    26         tcp_socket_client.sendall(data.encode('utf-8'))
    27         respone = tcp_socket_client.recv(bufsize)
    28         print(respone.decode('utf-8'))
    29     tcp_socket_client.close()
    30 
    31 if __name__ == '__main__':
    32     ip_port = ('121.195.167.34',9999)
    33     bufsize = 1024
    34     client_handler(ip_port,bufsize)

    j

  • 相关阅读:
    iOS 音频视频图像合成那点事
    Android低功耗蓝牙(BLE)使用详解
    android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果
    基于vue单页应用的例子
    Android 6.0 超级简单的权限申请 (Permission)
    ubuntu创建Centos7镜像&&配置运行环境
    Scikit-learn方法使用总结
    解决TensorFlow最新代码编译错误问题
    jQuery 基础
    数据交换格式 —— JSON(JavaScript Object Notation)
  • 原文地址:https://www.cnblogs.com/shachengcc1/p/11307362.html
Copyright © 2020-2023  润新知