认证客户端链接合法性(Python)

服务端代码:

from socket import *
import hmac, os

secret_key = b'123456io p'
def conn_auth(conn):
    '''
    认证客户端链接
    :param conn:
    :return:
    '''
    print('开始验证新链接的合法性')
    msg = os.urandom(32)                        #产生32位随机数
    conn.sendall(msg)                           #发送给客户端
    h = hmac.new(secret_key, msg)               #哈希验证
    digest = h.digest()                         #得到数字形式
    respone = conn.recv(len(digest))            #客户端回应的消息
    return hmac.compare_digest(respone, digest) #比较两个数字是否一样

def data_handler(conn, bufsize=1024):
    #判断链接是否合法
    if not conn_auth(conn):
        print('该链接不合法。关闭。')
        conn.close()
        return
    print('该链接合法,开始通信...')

    #通信循环
    while True:
        data = conn.recv(bufsize)
        if not data: break
        conn.sendall(data.upper())

def server_handler(ip_port, bufsize, backlog=5):
    '''
    只处理链接
    :param ip_port:
    :param bufsize:
    :param backlog:
    :return:
    '''
    tcp_socket_server = socket(AF_INET, SOCK_STREAM)
    tcp_socket_server.bind(ip_port)
    tcp_socket_server.listen(backlog)

    #接收链接
    while True:
        conn, addr = tcp_socket_server.accept()
        print('新链接[%s:%s]' %(addr[0], addr[1]))
        data_handler(conn, bufsize)
        
if __name__ == '__main__':
    ip_port = ('127.0.0.1', 8000)
    bufsize = 1024
    server_handler(ip_port, bufsize)

合法客户端代码:

from socket import *
import hmac, os

secret_key = b'123456io p'
def conn_auth(conn):
    '''
    验证客户端到服务器的链接
    :param conn:
    :return:
    '''
    msg = conn.recv(32)                 #收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', 8000)
    bufsize = 1024
    client_handler(ip_port, bufsize)

运行结果:
在这里插入图片描述
不合法客户端代码(不知道加密方式):

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', 8000)
    bufsize = 1024
    client_handler(ip_port, bufsize)

运行结果:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值