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

    '''认证客户端的链接合法性'''
    # import os, hmac
    # secret_key = b'just so so'
    #
    # msg1 = os.urandom(32)
    # print(msg1) # 32位随机字节
    # print(len(msg1)) # 长度一直为32
    #
    #
    # h = hmac.new(secret_key, msg1, 'sha256') # 数据被封装,格式为<class 'hmac.HMAC'>
    # print(h.digest()) # 必须使用指定的方法,即digest()得到固定长度为32位的字节
    # print(len(h.digest())) # 32位
    #
    # data = b'客户端发过来的信息'
    # hmac.compare_digest(h.digest(), data) # 判断a==b,a和b必须同一个类型(同为字节或同为字符串则放回True)
    
    import socketserver
    import os
    import hmac
    
    '''服务端'''
    secret_key = b'just so so' # 自行设置,用来加盐(md5加盐)
    class Myserver(socketserver.BaseRequestHandler):
       def handle(self):
          msg1 = os.urandom(32) # 随机生成32位字节
          self.request.sendall(msg1) # 将随机生成的32位字节发送给客户端
          h = hmac.new(secret_key, msg1, 'sha256') # 第三个参数必传入md5加密方式
          # print(type(h)) # <class 'hmac.HMAC'>
          h_digest = h.digest() # 上一步hmac.new()和这一步是一块使用的,目的是让服务端知道收多少个字节的数及与客户端发来的验证做比较
          # print(h_digest) # b"xc5x86xfaYG`&x9bxa7xf4apyxa20mxec)+lx96,09xf3N9xd2'xd3xfexd3"
          data = self.request.recv(len(h_digest)) # 收到客户端发来的验证消息
          if not hmac.compare_digest(h_digest, data): # hamc.compare_digest(a, b),判断a==b,a和b必须位同一类型(同为字节或同为字符串则返回True)
             print('客户端IP%s端口为%s的计算机链接成功...' % (self.client_address[0], self.client_address[1]))
             print('链接不合法,即将断开链接...')
             self.request.close()
             return
          print('客户端IP%s端口为%s的计算机链接成功...' % (self.client_address[0], self.client_address[1]))
          print('链接合法,即将进入消息循环...')
          while True:
             try:
                data1 = self.request.recv(1024)
                if not data1: break
                print('客户端发送的消息是:', data1.decode('utf-8'))
                self.request.sendall(data1.upper())
             except Exception:
                break
    
    if __name__ == '__main__':
       s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), Myserver)
       s.serve_forever()
    # 另一个模块代码
    from socket import *
    import hmac
    
    '''客户端合法链接'''
    secret = b'just so so' # 用作md5加盐
    
    tcp_client = socket(AF_INET, SOCK_STREAM)
    
    tcp_client.connect(('127.0.0.1', 8080))
    
    msg = tcp_client.recv(32)
    
    h = hmac.new(secret, msg, 'sha256')
    
    data = h.digest() # 得到结果是字节类型
    
    tcp_client.sendall(data)
    
    while True:
       res = input('请输入:').strip()
       if not res: continue
       tcp_client.sendall(res.encode('utf-8'))
       res1 = tcp_client.recv(1024)
       print('服务端回复:', res1.decode('utf-8'))
    # 另一个模块代码
    from socket import *
    import hmac
    
    '''客户端不合法链接'''
    secret = b'just so so1111' # 和服务端不一样,所以无法成功链接
    
    tcp_client = socket(AF_INET, SOCK_STREAM)
    
    tcp_client.connect(('127.0.0.1', 8080))
    
    msg = tcp_client.recv(32)
    
    h = hmac.new(secret, msg, 'sha256')
    
    data = h.digest()
    
    tcp_client.sendall(data)
    
    while True:
       res = input('请输入:').strip()
       if not res: continue
       tcp_client.sendall(res.encode('utf-8'))
       res1 = tcp_client.recv(1024)
       print('服务端回复:', res1.decode('utf-8'))
    while True: print('studying...')
  • 相关阅读:
    Python字符串前缀u、r、b、f含义
    Chrome文字识别插件:一键读图(OCR)
    GIT使用log命令显示中文乱码
    APP通用测试用例大全
    Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
    Python代码覆盖率工具coverage使用教程
    Python坑:不要使用可变对象作为函数默认值、生成器不保留迭代过后的结果、嵌套列表创建、==和is的区
    Appium元素定位方法
    你可能不知道的几个外挂浏览器脚本
    浏览器扩展插件(一)
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14811712.html
Copyright © 2011-2022 走看看