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

时间:2016-03-20 17:30:17

标签: python encryption cryptography

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

1 个答案:

答案 0 :(得分:1)

在GCM出现之前,Fernet更有意义,因为很难正确地实现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"")

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