Python中的 MultiFernet 模块
密码术是将明文转换为密文的过程或技术,以在从一台计算机到另一台计算机的传输过程中保护信息免受黑客攻击。 Python加密模块允许使用 fernet 模块将明文或消息(以字节为单位)转换为密文。 fernet 模块由内置方法 encrypt()、decrypt() 和 generate_key() 组成,用于加密、解密和生成加密密钥。没有密钥就无法操纵或阅读使用 fernet 加密的文本消息。 MultiFernet 类为 Fernet 实现密钥轮换。 MultiFernet 有一个内置方法rotate(),它可以进一步用于报废已暴露的旧密钥。
使用的方法:
generate_key():此方法生成一个新的 fernet 密钥。密钥必须保持安全,因为它是解密密文的最重要的组成部分。如果密钥丢失,则用户无法再解密消息。此外,如果入侵者或黑客获得了密钥,他们不仅可以读取数据,还可以伪造数据。
encrypt(data):它加密作为参数传递给方法的数据。这种加密的结果被称为“Fernet 令牌”,它基本上是密文。加密令牌还包含以明文形式生成时的当前时间戳。如果数据不是以字节为单位,则 encrypt 方法会引发异常。
Syntax: encrypt(data)
Parameter:
- data (bytes) – The plaintext to be encrypted.
Returns: A ciphertext that cannot be read or altered without the key. It is URL-safe base64-encoded and is referred to as Fernet token.
解密(令牌,ttl = 无):此方法解密作为参数传递给该方法的 Fernet 令牌。解密成功就得到原始明文,否则抛出异常。
Syntax: decrypt(token, ttl = None)
Parameters:
- token (bytes) – The Fernet token (ciphertext) is passed for decryption.
- ttl (int) – Optionally, one may provide an integer as the second parameter in the decrypt method. The ttl denotes the time about how long a token is valid. If the token is older than ttl seconds (from the time it was originally created) an exception is thrown. If ttl is not passed as a parameter, then age of the token is not considered. If the token is somehow invalid, an exception is thrown.
Returns: Returns the original plaintext.
rotate(token):此方法通过使用 MultiFernet 实例的主键重新加密来轮换令牌。但是,重新加密会保留最初与令牌一起保存的时间戳。
Syntax: rotate(token)
Parameter:
- token (bytes): The token to be rotated for re-encryption
Returns: If the token has successfully been rotated then the rotated token is returned. If rotation fails then it throws an exception.
安装加密包:
pip install cryptography
第一种方法
MultiFernet 使用提供的列表中的第一个密钥执行加密。 MultiFernet 依次使用每个密钥解密令牌。如果在提供的列表中找不到正确的密钥,则会引发 cryptography.fernet.InvalidToken 异常。在下面的代码片段中,生成了密钥并将其附加到列表中。 MultiFernet 获取第一个密钥并存储在 f 变量中。该密钥用于将明文加密为密文。另一方面,在解密过程中,MultiFernet 尝试使用列表中的所有密钥来解密密文。
Python3
# import Fernet and MultiFernet modules
from cryptography.fernet import Fernet, MultiFernet
# key generation
key1 = Fernet(Fernet.generate_key())
key2 = Fernet(Fernet.generate_key())
# the MultiFernet takes a list of Fernet instances
f = MultiFernet([key1, key2])
# encryption and token generation
token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!")
# display the ciphertext
print(token)
# decryption of ciphertext to plaintext
d = f.decrypt(token)
#display the plaintext
#decode() method converts byte to string
print(d.decode())
Python3
# import Fernet and MultiFernet modules
from cryptography.fernet import Fernet, MultiFernet
# key generation
key1 = Fernet(Fernet.generate_key())
key2 = Fernet(Fernet.generate_key())
# the MultiFernet takes a list of Fernet instances
f = MultiFernet([key1, key2])
# encryption and token generation
token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!")
# display the ciphertext
print(token)
# decryption of ciphertext to plaintext
d = f.decrypt(token)
#display the plaintext
print(d.decode())
print('Key rotation')
key3 = Fernet(Fernet.generate_key())
f2 = MultiFernet([key3, key1, key2])
rotated = f2.rotate(token)
d2 = f2.decrypt(rotated)
print(d2.decode())
输出:
b’gAAAAABfYfRrB3f0RQl108YFuGyFHZ2lIQBKpFkuEqJ0EgLi6TNPR9vhElTmyuo5EfBivBwEBfSkOQJPEtIqOBBKZH8iElFn3ON5eg5d_JA1G9oARG7RKiqiQiOP8R22U4pIxnO1banH’
Welcome to GeeksForGeeks Python Module!
第二种方法
第二种方法演示了密钥轮换。钥匙轮换使更换旧钥匙或外露钥匙变得容易。可以将新密钥添加到现有密钥列表的前面以开始加密新消息,旧密钥将被删除,因为它们不再需要。 MultiFernet.rotate() 提供的代币轮换限制了未检测到事件的损害,并增加了攻击的难度或频率。例如,如果一名有权访问公司 fernet 密钥的员工离职,公司将希望生成一个新的 fernet 密钥,轮换当前使用新密钥部署的所有令牌,并删除该员工有权访问的旧 fernet 密钥.这可以通过 MultiFernet 轻松实现。
蟒蛇3
# import Fernet and MultiFernet modules
from cryptography.fernet import Fernet, MultiFernet
# key generation
key1 = Fernet(Fernet.generate_key())
key2 = Fernet(Fernet.generate_key())
# the MultiFernet takes a list of Fernet instances
f = MultiFernet([key1, key2])
# encryption and token generation
token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!")
# display the ciphertext
print(token)
# decryption of ciphertext to plaintext
d = f.decrypt(token)
#display the plaintext
print(d.decode())
print('Key rotation')
key3 = Fernet(Fernet.generate_key())
f2 = MultiFernet([key3, key1, key2])
rotated = f2.rotate(token)
d2 = f2.decrypt(rotated)
print(d2.decode())
输出:
b’gAAAAABfYfUe1Zh3JAa33k_RBRgkXgh-40jS6iqjXEq5Tc6jCeds-QY_nmlhzjkVBdZzeoExKj-YJsefBkgVSjUH1CVNG4080cwa3ZBHA9Aftx5upXzNQnaZ5fgeJacPNY0jcm4PMZSs’
Welcome to GeeksForGeeks Python Module!
Key rotation
Welcome to GeeksForGeeks Python Module!