当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python MultiFernet用法及代码示例


密码学是将明文转换为密文的过程或技术,以保护信息在从一台计算机传输到另一台计算机期间免受黑客攻击。 Python 加密模块允许使用 fernet 模块将明文或消息(以字节为单位)转换为密文。 fernet 模块由内置方法 encrypt()、decrypt() 和 generate_key() 组成,用于加密、解密和生成加密 key 。使用 fernet 加密的文本消息在没有 key 的情况下无法被操纵或读取。 MultiFernet 类实现 Fernet 的 key 轮换。 MultiFernet 有一个内置方法 rotate(),可进一步用于废弃已暴露的旧 key 。

使用方法:

generate_key():此方法生成新的 fernet key 。 key 必须保持安全,因为它是解密密文的最重要组成部分。如果 key 丢失,则用户将无法再解密该消息。此外,如果入侵者或黑客获得 key ,他们不仅可以读取数据,还可以伪造数据。

encrypt(data):它对作为参数传递给方法的数据进行加密。这种加密的结果被称为“Fernet token”,它本质上是密文。加密令牌还包含以明文形式生成时的当前时间戳。如果数据不是以字节为单位,则 encrypt 方法会引发异常。

用法:encrypt(data)

范围:

  • 数据(字节)-待加密的明文。

返回:没有 key 就无法读取或更改的密文。它采用 URL-safe base64 编码,称为 Fernet 令牌。

crypto(token, ttl = None):此方法解密作为参数传递给该方法的 Fernet 令牌。解密成功则得到原始明文结果,否则抛出异常。

用法:decrypt(token, ttl = None)

参数:

  • token (字节)-Fernet 令牌(密文)被传递以进行解密。
  • ttl(int) - 或者,可以提供一个整数作为解密方法中的第二个参数。 ttl 表示令牌的有效时间。如果令牌早于 ttl 秒(从最初创建的时间算起),则会引发异常。如果 ttl 未作为参数传递,则不考虑令牌的年龄。如果令牌因某种原因无效,则会引发异常。

返回:返回原始明文。

rotate(token):此方法通过使用 MultiFernet 实例的主 key 重新加密来轮换令牌。但是,重新加密会保留最初与令牌一起保存的时间戳。

用法:rotate(token)

范围:

  • 代币(字节):要旋转以重新加密的令牌

返回:如果令牌已成功轮换,则返回轮换后的令牌。如果旋转失败,则会抛出异常。

安装加密包:

pip install cryptography

第一种方法
MultiFernet 使用提供的列表中的第一个 key 执行加密。 MultiFernet 依次使用每个 key 解密令牌。如果在提供的列表中找不到正确的 key ,则会抛出 cryptography.fernet.InvalidToken 异常。在下面的代码片段中,生成 key 并将其附加到列表中。 MultiFernet 获取第一个键并存储在 f 变量中。该 key 用于将明文加密为密文。另一方面,在解密过程中,MultiFernet尝试列表中的所有 key 来解密密文。

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())

输出

b’gAAAAABfYfRrB3f0RQl108YFuGyFHZ2lIQBKpFkuEqJ0EgLi6TNPR9vhElTmyuo5EfBivBwEBfSkOQJPEtIqOBBKZH8iElFn3ON5eg5d_JA1G9oARG7RKiqiQiOP8R22U4pIxnO1banH’

Welcome to GeeksForGeeks Python Module!

第二种方法
第二种方法演示了 key 轮换。钥匙轮换可以轻松更换旧的或暴露的钥匙。新 key 可以添加到现有 key 列表的前面以开始加密新消息,并且旧 key 将被删除,因为不再需要它们。 MultiFernet.rotate() 提供的令牌轮换限制了未检测到事件时的损害,并增加了攻击的难度或频率。例如,如果有权访问公司 fernet key 的员工离开,公司将需要生成新的 fernet key ,轮换当前使用新 key 部署的所有令牌,并删除该员工有权访问的旧 fernet key 。这可以通过 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
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!



相关用法


注:本文由纯净天空筛选整理自Shreyasi_Chakraborty大神的英文原创作品 MultiFernet Module in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。