我可以使用加密模块进行AES加密吗?什么是Fernet?它是否像AES加密一样安全?
答案 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个字节,因此,如果需要隐藏消息长度,则可以在加密之前将所有消息填充为相同长度。