面试题答案
一键面试协议设计思路
- 加密:使用对称加密算法(如AES)对敏感数据进行加密。在通信双方建立连接时,通过密钥交换协议(如Diffie - Hellman)协商共享密钥。
- 认证:采用数字签名机制。发送方使用私钥对数据进行签名,接收方使用发送方的公钥验证签名。可以使用RSA算法来实现公私钥对的生成和签名验证。
- 数据完整性校验:使用哈希函数(如SHA - 256)计算数据的哈希值,将哈希值与数据一同传输。接收方重新计算接收到数据的哈希值,并与发送方传来的哈希值进行比对,以确保数据完整性。
集成到Socket数据传输流程
- 连接建立阶段:双方通过Socket建立连接后,使用Diffie - Hellman算法协商共享密钥。
- 数据传输阶段:发送方对数据进行加密、签名,并计算哈希值,然后将加密后的数据、签名和哈希值一同发送。接收方接收数据后,先验证哈希值确保数据完整性,再使用发送方公钥验证签名,最后使用共享密钥解密数据。
- 连接关闭阶段:关闭Socket连接,释放资源。
核心代码框架及关键算法的Python实现思路
import socket
import hashlib
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
# Diffie - Hellman密钥交换
def diffie_hellman_exchange(sock):
# 这里省略具体的Diffie - Hellman实现细节,可参考相关库
pass
# 生成RSA密钥对
def generate_rsa_keys():
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
return private_key, public_key
# 加密数据
def encrypt_data(data, key):
cipher = AES.new(key, AES.MODE_EAX)
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)
return nonce, ciphertext, tag
# 解密数据
def decrypt_data(nonce, ciphertext, tag, key):
cipher = AES.new(key, AES.MODE_EAX, nonce)
data = cipher.decrypt_and_verify(ciphertext, tag)
return data
# 签名数据
def sign_data(data, private_key):
key = RSA.import_key(private_key)
h = hashlib.sha256(data).digest()
signature = pkcs1_15.new(key).sign(h)
return signature
# 验证签名
def verify_signature(data, signature, public_key):
key = RSA.import_key(public_key)
h = hashlib.sha256(data).digest()
try:
pkcs1_15.new(key).verify(h, signature)
return True
except (ValueError, TypeError):
return False
# 服务器端
def server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(1)
conn, addr = server_socket.accept()
# 密钥交换
shared_key = diffie_hellman_exchange(conn)
private_key, public_key = generate_rsa_keys()
conn.send(public_key)
while True:
nonce, ciphertext, tag, signature = conn.recv(1024)
if not nonce:
break
if verify_signature(ciphertext, signature, public_key):
data = decrypt_data(nonce, ciphertext, tag, shared_key)
print(f"Received: {data}")
else:
print("Signature verification failed")
conn.close()
server_socket.close()
# 客户端
def client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
# 密钥交换
shared_key = diffie_hellman_exchange(client_socket)
public_key = client_socket.recv(1024)
private_key, _ = generate_rsa_keys()
data = b"Sensitive data"
nonce, ciphertext, tag = encrypt_data(data, shared_key)
signature = sign_data(ciphertext, private_key)
client_socket.sendall(nonce + ciphertext + tag + signature)
client_socket.close()
if __name__ == "__main__":
import threading
server_thread = threading.Thread(target=server)
client_thread = threading.Thread(target=client)
server_thread.start()
client_thread.start()
server_thread.join()
client_thread.join()
以上代码框架仅为示例,实际应用中需要完善Diffie - Hellman密钥交换等具体实现,并处理异常情况等。