Python:加密Fernet:减少生成的加密文本的长度



我正在使用Cryptography Fernet进行加密和解密。加密数据后,它的长度非常大,有没有办法减少或限制它的长度?

示例:gAAAAABgUZeX2ffM7H07MfyZ2FGPj2xPSPbN0r3rQ1BzfKHsJ7QFUOgsqoOjOAh6Ksq-9fDCrLxb32g0NPbU6F7lZeSk7Xfgj-2vHHtTjxd3rj02qWGoaQ=

def encrypt(message):
encoded_message = message.encode()
f = Fernet(app.config['SECRET_KEY'])
encrypted_message = f.encrypt(encoded_message)
return encrypted_message.decode()

我认为最有效的方法是将Fernet输出以base64解码为二进制,正如"Pres.Polk"在评论中所建议的那样。这意味着,不使用return encrypted_message.decode(),而是使用:

# import base64
return base64.urlsafe_b64decode(encrypted_message)

当然,如果您的用例允许二进制数据,那么这将节省约25%的空间。(这就是base64编码的本质。(由于这已经是加密的数据,因此无法进行进一步的压缩。您可能会想在加密之前压缩数据,但这显然会削弱加密,因此不建议这样做(请参阅本密码学问答(。

请注意,如果您将主要处理少量数据,如您的示例所示(如果我没有错的话,120个字符的Fernet令牌意味着您的原始数据小于32个字节(,那么也许您根本不应该麻烦。由于Fernet的加密方案中需要元数据和填充(如其他评论所述(,相对于原始数据,它看起来只是"巨大"的,但对于较长的消息,开销几乎完全是由于base64编码(即增加约33%(。在这种情况下,如果解码为二进制,输出的长度将与原始数据的长度几乎相同。

实际上还有另一个效率较低的选项:对base64编码的输出字符串(例如zlib.compress(encrypted_message)(使用压缩。但这也会产生二进制数据,更重要的是,它已经在许多处理文本的环境中自动完成了(例如在网络上(。

最新更新