11.9 简单的客户端认证
可以利用 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例:
- from socket import socket, AF_INET, SOCK_STREAM
- secret_key = b'peekaboo'
- def echo_handler(client_sock):
- if not server_authenticate(client_sock, secret_key):
- client_sock.close()
- return
- while True:
- 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)
- Within a client, you would do this:
- from socket import socket, AF_INET, SOCK_STREAM
- secret_key = b'peekaboo'
- s = socket(AF_INET, SOCK_STREAM)
- s.connect(('localhost', 18000))
- client_authenticate(s, secret_key)
- s.send(b'Hello World')
- resp = s.recv(1024)
hmac
认证的一个常见使用场景是内部消息通信系统和进程间通信。例如,如果你编写的系统涉及到一个集群中多个处理器之间的通信,你可以使用本节方案来确保只有被允许的进程之间才能彼此通信。事实上,基于 的认证被 multiprocessing
模块使用来实现子进程直接的通信。
hmac认证算法基于哈希函数如MD5和SHA-1,关于这个在IETF RFC 2104中有详细介绍。