密码模块是Fernet安全的,我可以使用该模块进行AES加密吗?

Hor*_*moz 4 python encryption cryptography

我可以使用密码模块进行AES加密吗?什么是Fernet,它像AES加密一样安全吗?

dsp*_*els 7

正如Scott Arciszewski 在评论中回答的那样,Fernet基本上是CBC模式下的AES128,具有SHA256 HMAC消息身份验证代码。

有关Fernet结构的完整规格,请参见此处


L. *_*nen 5

Fernet 在 GCM 出现之前更有意义,因为自己正确实现 CBC + HMAC 很困难,而且 CBC 模式需要填充到 16 字节块。

它仍然是安全的,但我不建议将它用于新系统,因为 AES256-GCM 将加密和身份验证结合到相同的标准协议中,浏览器(Javascript 微妙的加密 API)和所有其他加密库和工具可以对其进行加密/解密,而不是只是 Python 加密模块。GCM 模式也快得多,使用 AES-NI 达到每秒几 GB。

不幸的是,它隐藏在hazmat模块深处:

import secrets
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# Generate a random secret key (AES256 needs 32 bytes)
key = secrets.token_bytes(32)

# Encrypt a message
nonce = secrets.token_bytes(12)  # GCM mode needs 12 fresh bytes every time
ciphertext = nonce + AESGCM(key).encrypt(nonce, b"Message", b"")

# Decrypt (raises InvalidTag if using wrong key or corrupted ciphertext)
msg = AESGCM(key).decrypt(ciphertext[:12], ciphertext[12:], b"")
Run Code Online (Sandbox Code Playgroud)

即使使用相同的密钥和相同的消息,密文也总是完全不同的(因为不同的随机数)。请注意,密文总是比消息长 28 个字节,因此如果需要隐藏消息长度,您可以在加密之前将所有消息填充到相同的长度。

  • 我认为除了 Fernet 之外,实际上所有东西都“隐藏”在“hazmat”中,因为它的设计很难搞砸。用户像您一样创建并添加自己的随机数的要求*极其*重要。尽管他们应该将其纳入另一个罐装标准,并将其称为 Carciofo 或其他名称。 (4认同)