码迷,mamicode.com
首页 > 其他好文 > 详细

认证客户端的链接合法性

时间:2018-08-16 11:23:31      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:random   strip   connect   .com   cep   serve   stream   utf-8   验证   

摘自:http://www.cnblogs.com/linhaifeng/articles/6129246.html#_label14

如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现

server.py

#_*_coding:utf-8_*_
__author__ = Linhaifeng
from socket import *
import hmac,os

secret_key=blinhaifeng bang bang bang
def conn_auth(conn):
    ‘‘‘
    认证客户端链接
    :param conn:
    :return:
    ‘‘‘
    print(开始验证新链接的合法性)
    msg=os.urandom(32)  # 随机产生一个32位的密钥
    conn.sendall(msg)
    h=hmac.new(secret_key,msg)  # hmac类似于md5,这里是加盐的方式
    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:
    :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,9999)
    bufsize=1024
    server_handler(ip_port,bufsize)

client.py

#_*_coding:utf-8_*_
__author__ = Linhaifeng
from socket import *
import hmac,os

secret_key=blinhaifeng bang bang bang
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)

 

认证客户端的链接合法性

标签:random   strip   connect   .com   cep   serve   stream   utf-8   验证   

原文地址:https://www.cnblogs.com/dangrui0725/p/9485966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!