hmac简单socket验证

来源:互联网 发布:水量伺服器 知乎 编辑:程序博客网 时间:2024/06/05 22:43

python cookbook 3rd.pdf

13.9.1 问题

你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像 SSL 那样的复杂。

import hmacimport osfrom socket import socket, AF_INET, SOCK_STREAMdef server_authenticate(connection, secret_key):    '''    Request client authentication.    '''    message = os.urandom(32)    connection.send(message)    hash = hmac.new(secret_key, message)    digest = hash.digest()    response = connection.recv(len(digest))    print(hmac.compare_digest(digest, response))    return hmac.compare_digest(digest, response)secret_key = b'peekaboo'def echo_handler(client_sock):    if not server_authenticate(client_sock, secret_key):        client_sock.close()        return    while True:        msg = client_sock.recv(8192)        if not msg:            break        client_sock.sendall(msg)def echo_server(address):    s = socket(AF_INET, SOCK_STREAM)    s.bind(address)    s.listen(5)    while True:        c,a = s.accept()        echo_handler(c)echo_server(('', 20000))

client.py

from socket import socket, AF_INET, SOCK_STREAMimport hmacdef client_authenticate(connection, secret_key):    '''    Authenticate client to a remote service.    connection represents a network connection.    secret_key is a key known only to both client/server.    '''    message = connection.recv(32)    hash = hmac.new(secret_key, message)    digest = hash.digest()    connection.send(digest)secret_key = b'peekaboo's = socket(AF_INET, SOCK_STREAM)s.connect(('localhost', 20000))client_authenticate(s, secret_key)s.send(b'Hello World')resp = s.recv(1024)print(resp)s.send(b'kitty')print (s.recv(1024))





0 0