【问题标题】:Cryptography.fernet.InvalidToken when sending encrypted message over network通过网络发送加密消息时的 Cryptography.fernet.InvalidToken
【发布时间】:2019-11-12 15:00:58
【问题描述】:

我正在尝试使用套接字和 cryptography.fernet 库通过本地网络发送加密字符串,但是当收到字节时,它会引发“cryptography.fernet.InvalidToken”错误。如果我在一个文件中加密和解密,它确实有效,但如果我在本地或两台不同的计算机上托管服务器和客户端,则不会。

服务器

    import socket
    from cryptography.fernet import Fernet
    crypt = Fernet('sqcyNL5kz2mxWb1KL2QSZWY-GCERE-scEgWBbvq9CCk=')
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen(10)
        conn, addr = s.accept()
        with conn:
            while True:
                messageEncrypt = conn.recv(2048)
                message = crypt.decrypt(messageEncrypt, None).decode()
                print(message)

客户

    import socket
    from cryptography.fernet import Fernet
    crypt = Fernet('sqcyNL5kz2mxWb1KL2QSZWY-GCERE-scEgWBbvq9CCk=')
    message = 'sentence'
    messageEncode = message.encode()
    messageEncrypt = crypt.encrypt(messageEncode)
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(messageEncrypt)
        s.close()

客户端编码、加密,然后发送消息,客户端接收消息并解密。服务器确实正确解密并打印了消息,但立即崩溃阻止程序的其余部分运行。 奇怪的是,在它崩溃之前解密后有足够的时间打印。有谁知道为什么会发生这种情况?

服务器控制台:

sentence
Traceback (most recent call last):
  File "E:/Google Drive/School/###/###/python/project/morseSrv.py", line 50, in <module>
message = crypt.decrypt(messageEncrypt).decode()
  File "C:\Python\lib\site-packages\cryptography\fernet.py", line 74, in decrypt
timestamp, data = Fernet._get_unverified_token_data(token)
  File "C:\Python\lib\site-packages\cryptography\fernet.py", line 92, in _get_unverified_token_data
raise InvalidToken
cryptography.fernet.InvalidToken

Process finished with exit code 1

【问题讨论】:

  • 您的协议中没有任何框架。 TCP 不保证传递边界。您可能会发送“xxx”并接收“x”,然后是“x”,然后是“x”。或者反过来。
  • 感谢一个写得很好的问题。您可能想牢记@Jean-PaulCalderone 的评论,并了解如何编写可靠代码来使用套接字发送和接收数据。

标签: python python-3.x networking encryption cryptography


【解决方案1】:

问题是由服务器中的 while True 循环引起的。当它接收到数据时,它会再次循环,但不会等待新数据。我已经对其进行了修改,使其在处理完消息后跳出循环。

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多