为什么Fernet加密令牌始终以相同的顺序开始?(Python加密包)

dee*_*eef 2 python cryptography

我一直在使用Cryptography包Fernet(对称加密)模块.

加密某些文本时,如:

key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"some random text")
Run Code Online (Sandbox Code Playgroud)

令牌始终以相同的字节序列开头,如下所示:"gAAAABU80.....".

为什么是这样?

Ste*_*ppo 7

您可以通过阅读源代码来收集,加密的有效负载具有以下结构:

b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext
Run Code Online (Sandbox Code Playgroud)

你从中得到encrypt的是有效载荷的base64编码.

第一个字节是0x80硬编码的.以下8个字节是64位时间戳,采用big-endian顺序.由于它是时间戳,因此最重要的字节将随时间缓慢变化.Big-endian被命令MSB到LSB,所以那些"粘性"字节是你在读取字符串时会遇到的第一个字节.

Base64(部分)字符串gAAAABU80编码54位,几乎是7个字节.因此,该部分编码0x80魔法和时间戳的6个MSB,那些随时间变化较慢的MSB.在加密新邮件之前等待几个小时,您将看到标题更改.

  • 第一个字节编码 Fernet 的版本(当前版本 0 始终为 0x80,如答案中所示)。 (2认同)