python3 验证客户端链接的合法性

服务端:

  1.secret_key为bytes类型

  2.random_bytes = os.urandom(n) 随机生成一个长度为n的random_bytes

  server.send(random_bytes)发送给客户端

  3.hmac_bytes = hmac(secret_key, random_bytes, ‘md5‘).digest()

  通过hmac模块对secret_key和random_bytes进行md5加密,生成一个md5加密后的hmac_bytes

  client_hmac_bytes = server.recv(len(hmac_bytes))

  接收长度为len(hmac_bytes)的客户端md5加密后的client_hmac_bytes

  hmac.compare_digest(hmac_bytes, client_hmac_bytes)

  使用hmac.compare_digest()方法对比hmac_bytes和client_hmac_bytes是否一致

客户端:

  1.secret_key为bytes类型

  2.random_bytes = client.recv(n) 接收长度为n的random_bytes

  3.client_hmac_bytes = hmac(secret_key, random_bytes, ‘md5‘).digest()

  通过hmac模块对secret_key和random_bytes进行md5加密,生成一个md5加密后的client_hmac_bytes

  client.send(client_hmac_bytes) 将client_hmac_bytes发送给服务端

--------------------------------tcp_server.py--------------------------------# coding:utf-8
import os
import hmac
import socket

secret_key = b‘This is my secret key‘  # bytes类型

def conn_auth(conn):
    random_bytes = os.urandom(32)  # 随机生成长度为32字节的bytes
    conn.send(random_bytes)  # 发送给客户端
    server_md5_bytes = hmac.new(secret_key, random_bytes, ‘md5‘).digest()  # md5加密后的bytes
    client_md5_bytes = conn.recv(len(server_md5_bytes))  # 接收客户端数据
    return hmac.compare_digest(server_md5_bytes, client_md5_bytes)  # 对比md5加密后的bytes

def data_handler(conn, bufsize=1024):
    if not conn_auth(conn):
        print("客户端链接认证失败.")
        conn.close()
        return

    print("客户端链接认证成功.")
    while 1:
        client_msg = conn.recv(bufsize)
        if not client_msg: break
        print("客户端消息: ", client_msg.decode("utf-8"))
        conn.send(client_msg.upper())

def server_handler(ip_port, backlog=5):
    server = socket.socket()
    server.bind(ip_port)
    server.listen(backlog)

    while 1:
        conn, addr = server.accept()
        print("客户端链接地址: %s 端口号: %s" % (addr[0], addr[1]))
        data_handler(conn)

    conn.close()
    server.close()

if __name__ == ‘__main__‘:
    ip_port = ("127.0.0.1", 8001)
    bufsize = 1024
    server_handler(ip_port, bufsize)

--------------------------------tcp_client.py--------------------------------# coding:utf-8
import hmac
import socket

secret_key = b‘This is my secret key.‘  # bytes类型

def conn_auth(conn):
    server_bytes = conn.recv(32)  # 接收来自服务端的随机bytes
    client_md5_bytes = hmac.new(secret_key, server_bytes, ‘md5‘).digest()  # md5加密后的bytes
    conn.send(client_md5_bytes)  # 把md5加密后的bytes发送给服务端

def client_handler(ip_port, bufsize=1024):
    client = socket.socket()
    client.connect(ip_port)
    conn_auth(client)

    while 1:
        inp = input(">>>: ").strip()
        if not inp: continue
        if inp.upper() == "Q": break
        client.send(inp.encode("utf-8"))
        server_msg = client.recv(bufsize)
        print("服务端消息: ", server_msg.decode("utf-8"))
    client.close()

if __name__ == ‘__main__‘:
    ip_port = ("127.0.0.1", 8001)
    bufsize = 1024
    client_handler(ip_port, bufsize)

原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10945655.html

时间: 2024-10-16 07:06:52

python3 验证客户端链接的合法性的相关文章

Python全栈开发--socketserver模块和验证客户端链接的合法性

验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_auth(conn): ''' 认证客户端链接 :param conn: :return: ''' print('开始验证新链接的合法性') msg=os.urandom(32) conn.sendall(msg) h=

《Python》网络编程之验证客户端链接的合法性、socketserver模块

一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接,(阻塞式)等待连接的到来 # 客户端套接字函数 s.connect() # 主动初始化TCP服务器连接 s.connect_ex() # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 # 公共用途的套接字函数 s.recv() # 接收TCP数据 s.send() # 发送TC

验证客户端链接以及socketserver模块

1 服务端套接字函数 2 s.bind() 绑定(主机,端口号)到套接字 3 s.listen() 开始TCP监听 4 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 5 6 客户端套接字函数 7 s.connect() 主动初始化TCP服务器连接 8 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 9 10 公共用途的套接字函数 11 s.recv() 接收TCP数据 12 s.send() 发送TCP数据 13 s.

socket认证客户端链接合法性

服务器端: 1 #_*_coding:utf-8_*_ 2 __author__ = 'Linhaifeng' 3 from socket import * 4 import hmac,os 5 6 secret_key=b'linhaifeng bang bang bang' 7 def conn_auth(conn): 8 ''' 9 认证客户端链接 10 :param conn: 11 :return: 12 ''' 13 print('开始验证新链接的合法性') 14 msg=os.ur

socketserver和socket的补充(验证客户端合法性)

一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系列应为AF_INET(默认值ipv4),AF_INET6(ipv6),AF_UNIX,AF_CAN或AF_RDS. (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为SOCK_STREAM(默认值,tcp协议),SOCK_DGRAM(udp协议),SOCK_R

HTML表单 在提交之前 验证表单数字合法性

function checkform(){ if(!isNumeric($('.apply_money').val())){ alert("必须是数字"); return false; } var num = parseInt($('.apply_money').val()); if(num<=0){ alert("请输入大于0的数"); return false; } return true; } <form action="?action=

CentOS6.7环境下SVN搭建与客户端链接

环境:CentOS 6.7系统,安装办法:yum 1. rpm –qa | grep subversion//查看是否有安装了subversion,想卸载就把他卸载了 yum remove subversion//卸载 yum install -y subversion  httpd  mod_dav_svn//安装对应的包和模块 svnserve –version//检查是否成功安装,输出如下即为安装成功 2. 创建svn用户 useradd -s /sbin/nologin  svn 3.

java 客户端链接不上redis解决方案

出现问题描述: 1.Could not get a resource from the pool, Connection refused: connect windows Java这边客户端链接被拒接了,想想问题 1.Vmware里面的Linux所安装的Redis已经正常启动 2.在windows用ssh客户端链接linux可以操作redis 3.linux防火墙已经关闭 4.拼linux的ip也能拼通 按理说应该没问题,下利用telnet测试下端口 telnet 192.168.0.104 6

java基础入门-建立可以多客户端链接的ServerSocket

承接上一篇文章,今天谈论一下可以多客户端链接的ServerSocket. 这里面注意涉及到的技术点是: 1.ServerSocket 2.多线程 这次我们分成两个类来实现,先上代码: package com.test.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Sock