Python 密码学 Fernet.generate_key() 密钥长度

Python cryptography Fernet.generate_key() key length

我不太了解密码学,但是当我在 python 中使用密码学库并尝试生成密钥时,密钥长度超过 32

from cryptography.fernet import Fernet
import base64

key = Fernet.generate_key()
>>>x2pXHXqCcUGjcq4HTcvdqH5xSEF_SLATO6p1Xk3tejM=

如果我使用此密钥解密消息在线或外部python,它会说密钥的最大长度为 32 我读到加密库使用 128 位密钥 CBC AES。

我不确定这是否与填充有关,我的问题是是否可以使用此密钥在 python 之外解密 Fernet 加密的消息,或者无论如何我可以获得原始的 16 字节密钥(因为它应该使用 128 键)

Fernet.generate_key()生成并由构造函数期望的密钥实际上由两个128位密钥组成:一个用于签名,另一个用于加密,按此顺序连接。

来自source code

    key = base64.urlsafe_b64decode(key)
    if len(key) != 32:
        raise ValueError(
            "Fernet key must be 32 url-safe base64-encoded bytes."
        )

    self._signing_key = key[:16]
    self._encryption_key = key[16:]

更新感谢@PaulKehrer

这在 format specification 中有描述,引用如下:

一个fernet key是以下字段的base64url编码:

Signing-key ‖ Encryption-key
  • 签名密钥,128 位
  • 加密密钥,128 位

使用低级库和服务解密 Fernet 消息需要手动解析 token format

  • Fernet 生成 url-安全的 base64
  • 除了数据,令牌还包含版本、时间戳、IV 和 HMAC