在构建分布式WebSocket聊天系统时,为了保证消息传输的安全性,可以使用加密技术来保护消息内容。以下是一个简单的例子,展示如何使用Python的websockets
库和cryptography
库来实现加密聊天消息。
首先,确保安装了所需的库:
pip install websockets cryptography
下面是服务器端和客户端的代码示例:
服务器端 (server.py
):
import asyncio
import websockets
from cryptography.fernet import Fernet
# 生成一个密钥并保存,确保客户端使用相同的密钥
key = Fernet.generate_key()
async def encrypt_message(message, key):
fer = Fernet(key)
encrypted_message = fer.encrypt(message.encode())
return encrypted_message
async def decrypt_message(message, key):
fer = Fernet(key)
decrypted_message = fer.decrypt(message).decode()
return decrypted_message
async def echo(websocket, path):
async for message in websocket:
encrypted_message = await encrypt_message(message, key)
await websocket.send(encrypted_message)
start_server = websockets.serve(echo, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
客户端 (client.py
):
import asyncio
import websockets
from cryptography.fernet import Fernet
# 使用与服务器端相同的密钥
key = b'your-generated-key' # 替换为服务器端生成的密钥
async def encrypt_message(message, key):
fer = Fernet(key)
encrypted_message = fer.encrypt(message.encode())
return encrypted_message
async def decrypt_message(message, key):
fer = Fernet(key)
decrypted_message = fer.decrypt(message).decode()
return decrypted_message
async def send_message(websocket, message):
encrypted_message = await encrypt_message(message, key)
await websocket.send(encrypted_message)
async def recv_message(websocket):
message = await websocket.recv()
decrypted_message = await decrypt_message(message, key)
return decrypted_message
async def main():
async with websockets.connect("ws://localhost:8765") as websocket:
while True:
message = input("Enter your message: ")
await send_message(websocket, message)
response = await recv_message(websocket)
print(f"Received: {response}")
asyncio.get_event_loop().run_until_complete(main())
在这个例子中,服务器端和客户端都使用了相同的密钥来生成Fernet
对象。发送的消息在传输前被加密,接收时再解密。这样可以在一定程度上保护消息内容不被中间人攻击或监听所获取。记得在实际应用中,密钥的管理要格外小心,避免泄露。