面试题答案
一键面试中间人攻击原理
在Python套接字通信中,中间人攻击(MITM)的原理是攻击者在通信双方(客户端和服务器端)之间插入自己,拦截、篡改或伪造通信数据。攻击者通过欺骗客户端和服务器,使其认为攻击者是合法的通信对象,从而在不被察觉的情况下获取敏感信息或破坏通信。例如,攻击者可以冒充服务器接收客户端发送的登录凭证,或者篡改服务器返回给客户端的指令等。
防止中间人攻击的策略
- 使用SSL/TLS加密:通过SSL/TLS协议对通信数据进行加密,确保数据在传输过程中不被窃取或篡改。Python中可以使用
ssl
模块来实现。 - 证书验证:客户端验证服务器提供的数字证书,确保连接的是合法服务器,防止攻击者冒充。
- 密钥交换:采用安全的密钥交换算法,如Diffie - Hellman,在通信双方之间安全地交换加密密钥。
关键代码片段
- 使用SSL/TLS加密(服务器端示例)
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(certfile="server.crt", keyfile="server.key")
bind_ip = '0.0.0.0'
bind_port = 9999
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5)
print('Listening on {}:{}'.format(bind_ip, bind_port))
while True:
client, addr = server.accept()
ssl_client = context.wrap_socket(client, server_side=True)
try:
data = ssl_client.recv(1024)
print('Received: {}'.format(data.decode('utf - 8')))
ssl_client.send('Message received successfully'.encode('utf - 8'))
except ssl.SSLError as e:
print('SSL error: {}'.format(e))
finally:
ssl_client.close()
- 使用SSL/TLS加密(客户端示例)
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_verify_locations(cafile="ca.crt")
target_host = '127.0.0.1'
target_port = 9999
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_client = context.wrap_socket(client, server_hostname=target_host)
ssl_client.connect((target_host, target_port))
ssl_client.send('Hello, server!'.encode('utf - 8'))
response = ssl_client.recv(1024)
print('Received: {}'.format(response.decode('utf - 8')))
ssl_client.close()
在上述代码中,服务器端通过context.load_cert_chain
加载自己的证书和私钥,客户端通过context.load_verify_locations
加载CA证书来验证服务器证书,从而有效防止中间人攻击。