Python套接字突然接收了不同的Fernet密钥

问题描述

所以我正在尝试使用tkinter gui创建消息应用程序。我有一个客户端和一个服务器,当前仅在本地运行。

因此,我生成一个首先发送到服务器的Fernet密钥,因此我们两个都可以使用相同的密钥进行加密(我知道在发送时可能应该对其进行加密)。

我第一次调用client.connect()时,它工作正常,获取密钥并检查roomId是否存在。如果没有,它会吐出一个错误,一切都很好。但是,如果我再试一次,则调用client.connect()服务器接收到的Fernet密钥会搞砸了。

First time
Client
b'Nwb0wki6ydmeZgEyMqo0ZFvvPm_grlpnYicjhCMZTMg='
b'Nwb0wki6ydmeZgEyMqo0ZFvvPm_grlpnYicjhCMZTMg='
b'Nwb0wki6ydmeZgEyMqo0ZFvvPm_grlpnYicjhCMZTMg='
Server
b'Nwb0wki6ydmeZgEyMqo0ZFvvPm_grlpnYicjhCMZTMg='

您第一次看到它就可以正常运行

Second time
Client
b'tq2uBDFfpV0vAmDNpJKmA-87ElJqa5Unsme7OGCTG80='
b'tq2uBDFfpV0vAmDNpJKmA-87ElJqa5Unsme7OGCTG80='
b'tq2uBDFfpV0vAmDNpJKmA-87ElJqa5Unsme7OGCTG80='
Server
b'tq2uBDFfpV0vAmDNpJKmA-87ElJqa5Unsme7OGCTG80=gAAAAABfmnNNS9XplQlqNf3-7vlEgk-VAHsq6EIJaWTUhLyaCqIictM7v5rnh6_dMhKKNvGc3otMi08SEhtmgfyK3KSXD6SckOk9abFGW6-KS36b3jtThBdmid1EXxCmu7B0IgmulmZF_K0VhKAiOEty74nqZ_YLkDzfaaKHzXnPsfx-39ssKSA='

即使我正在调用完全相同的方法,并且它建立了新的连接,并且似乎正在发送完全正确的密钥,服务器仍收到完全不同的信息。是的,我只有一个客户端连接到服务器

客户端连接功能


def connect(self,username="joe",roomId="12346",host="127.0.0.1",port="9001"):
    self.host = host
    self.port = int(port)
    self.key = fernet.Fernet.generate_key()
    print(self.key)
    self.username = username
    try:
        self.sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
        self.sock.connect((self.host,self.port))
        self.connected = True

        print(self.key)
        self.sock.send(self.key)
        print(self.key)
        print("sendte key")

        self.sock.sendall(Encryption().encryptMsg(self.username,self.key))
        print("sendte username")

        self.sock.sendall(Encryption().encryptMsg(roomId,self.key))
        print(roomId)
        print("sendte roomId")

        msg = self.sock.recv(1024)
        msg = Encryption().decryptMsg(msg,self.key)
        print(msg)

        if msg["msg"] == False:
            self.disconnect()
            return False

        self.clientId,self.roomId = msg["msg"]

        self.thread = threading.Thread(target=self.listen)
        self.thread.start()
        print("Started listening")
        print(self.username,self.roomId,self.clientId)

        return True

    except Exception as e:
        print(e)
        self.disconnect()
        return False

def disconnect(self):
    print("lukker sock")
    self.sock.shutdown(socket.SHUT_RDWR)

服务器接收功能


def run(self):
    self.sock.bind((self.host,self.port))
    self.sock.listen(self.listenInt)
    while True:
        # try:
        conn,addr = self.sock.accept()
        print("Got connection from: ",addr)

        newCon = threading.Thread(
            target=self.handleConnection,args=(conn,addr))
        newCon.start()

    self.sock.close()

def handleConnection(self,conn,addr):
    print("startet handler")
    key = conn.recv(1024)
    print("fikk key")
    print(key)
    username = Encryption().decryptMsg(conn.recv(1024),key)["msg"]
    print("fikk username")
    print(username)

    roomId = int(Encryption().decryptMsg(conn.recv(1024),key)["msg"])
    print("fikk roomid")
    print(roomId)
    print(self.rooms)

    if roomId == 0:
        room = Room(self)
        roomId = room.roomId
        self.rooms[roomId] = room
        print("lagde rom")
    elif roomId not in self.rooms:
        print("finner ikke rom")
        conn.sendall(Encryption().encryptMsg(False,key))
        print("sendte false")
        conn.close()
        return

    room = self.rooms[roomId]

    newCon = threading.Thread(
        target=serverConnection,addr,key,room,username))
    newCon.start()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)