为什么 Fernet 加密令牌总是以相同的序列开头? (Python 密码学包)
Why does a Fernet encryption token always start with the same sequence? (Python Cryptography package)
我一直在玩 Cryptography package, and the Fernet (symmetric encryption) module。
加密某些文本时,例如:
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"some random text")
令牌始终以相同的字节序列开头,如下所示:"gAAAABU80....."
。
这是为什么?
您可以从阅读 the source code 中了解到,加密的有效负载具有以下结构:
b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext
你从 encrypt
得到的是有效载荷的 base64 编码。
第一个字节是 0x80
,硬编码。接下来的 8 个字节是一个 64 位的时间戳,按照 big-endian 的顺序。由于它是时间戳,因此最重要的字节会随着时间缓慢变化。 Big-endian 是从 MSB 到 LSB 排序的,因此那些 "sticky" 字节是您在读取字符串时遇到的第一个字节。
Base64(部分)字符串gAAAABU80
编码54bits,也就是差不多7个字节。因此,该部分对 0x80
魔术和时间戳的 6 个 MSB 进行编码,这些内容会随着时间的推移而变化得更慢。在加密新消息之前等待几个小时,您将看到 header 变化。
我一直在玩 Cryptography package, and the Fernet (symmetric encryption) module。
加密某些文本时,例如:
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"some random text")
令牌始终以相同的字节序列开头,如下所示:"gAAAABU80....."
。
这是为什么?
您可以从阅读 the source code 中了解到,加密的有效负载具有以下结构:
b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext
你从 encrypt
得到的是有效载荷的 base64 编码。
第一个字节是 0x80
,硬编码。接下来的 8 个字节是一个 64 位的时间戳,按照 big-endian 的顺序。由于它是时间戳,因此最重要的字节会随着时间缓慢变化。 Big-endian 是从 MSB 到 LSB 排序的,因此那些 "sticky" 字节是您在读取字符串时遇到的第一个字节。
Base64(部分)字符串gAAAABU80
编码54bits,也就是差不多7个字节。因此,该部分对 0x80
魔术和时间戳的 6 个 MSB 进行编码,这些内容会随着时间的推移而变化得更慢。在加密新消息之前等待几个小时,您将看到 header 变化。