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
我不太了解密码学,但是当我在 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