11.9 简单的客户端认证

    可以利用 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例:

    1. from socket import socket, AF_INET, SOCK_STREAM
    2.  
    3. secret_key = b'peekaboo'
    4. def echo_handler(client_sock):
    5. if not server_authenticate(client_sock, secret_key):
    6. client_sock.close()
    7. return
    8. while True:
    9.  
    10. if not msg:
    11. break
    12. client_sock.sendall(msg)
    13.  
    14. def echo_server(address):
    15. s = socket(AF_INET, SOCK_STREAM)
    16. s.bind(address)
    17. s.listen(5)
    18. while True:
    19. c,a = s.accept()
    20. echo_handler(c)
    21.  
    22.  
    23. Within a client, you would do this:
    24.  
    25. from socket import socket, AF_INET, SOCK_STREAM
    26.  
    27. secret_key = b'peekaboo'
    28.  
    29. s = socket(AF_INET, SOCK_STREAM)
    30. s.connect(('localhost', 18000))
    31. client_authenticate(s, secret_key)
    32. s.send(b'Hello World')
    33. resp = s.recv(1024)

    hmac 认证的一个常见使用场景是内部消息通信系统和进程间通信。例如,如果你编写的系统涉及到一个集群中多个处理器之间的通信,你可以使用本节方案来确保只有被允许的进程之间才能彼此通信。事实上,基于 的认证被 multiprocessing 模块使用来实现子进程直接的通信。

    hmac认证算法基于哈希函数如MD5和SHA-1,关于这个在IETF RFC 2104中有详细介绍。