使用Cryptography模块在Python中进行Fernet(对称加密)

2025 年 1 月 5 日 | 阅读 9 分钟

对称加密简介

对称加密是密码学领域的基础,其工作原理基于一个关键标准:使用同一个密钥进行加密和解密操作。它通过计算实现,同一个密钥将明文加密成密文,然后再将密文解密回原始明文。

什么是对称加密?

对称加密涉及通信双方之间共享一个秘密密钥。这个密钥保持机密,并作为加密和解密消息的关键。常见的对称加密算法包括 AES(高级加密标准)、DES(数据加密标准)和 Fernet。

目的和重要性

对称加密的意义在于其高效保护敏感数据的能力。它确保了数据的保密性、完整性和真实性,从而降低了未经授权访问和数据泄露的风险。通过使用同一个密钥进行加密和解密,对称加密简化了流程,同时保持了强大的安全措施。

Fernet 加密简介

在 Python 生态系统中,cryptography 库提供了多种加密功能,包括 Fernet 加密。Fernet 是一种对称加密算法,提供了一种简单安全的数据加密和解密方法。它的简洁性和健壮性使其成为 Python 应用程序中保护敏感信息的流行选择。

Fernet 加密作为 cryptography 库的一部分,使用对称密钥加密和认证加密。它不仅确保数据被加密,还包含了在解密时验证数据完整性的机制,防止未经授权的修改或篡改。

了解我们的 Fernet 加密

Fernet 技术概述

Fernet 是 Python cryptography 库中的一种实现,作为一种对称加密算法运行。它通过使用对称密钥加密来实现,即使用相同的秘密密钥来加密和解密数据。在底层,Fernet 使用对称密码,主要是 AES 结合 CBC(密码块链接)模式和 PKCS7 填充,确保了强大的安全性和跨不同系统的兼容性。

Fernet 的操作步骤如下:

密钥确定或派生: 它从用户提供的密钥中获取加密密钥,通过从用户输入生成一个 256 位密钥来增强安全性。

初始化向量(IV)生成: 每次加密操作都会生成一个 IV,以防止加密数据中的模式,并增强对某些类型攻击的防御能力。

加密和认证: Fernet 使用 AES 加密数据,并包含一个消息认证码(MAC)来验证数据的完整性。这种认证加密确保了保密性和数据完整性。

特性和特点

Fernet 加密具有一些有助于其有效性的关键特性:

对称性: Fernet 遵循对称加密模型,使用同一个共享密钥进行加密和解密操作,确保了简洁性和速度。

认证加密: 它使用认证加密,不仅确保保密性,还验证数据的完整性。这可以防止未经授权的修改或篡改。

易于使用: Fernet 在 Python 的 cryptography 库中的实现提供了一个直观且简单的 API,使其对开发人员来说易于访问。

Fernet 的认证加密使其区别于其他对称加密方法。它同时保证数据的保密性和完整性,在需要确保加密数据完整性的场景中提供强大的安全层。

与其他加密方法的比较

与其他对称加密方法(如 AES 和 DES)相比,Fernet 加密因其自动包含认证加密而脱颖而出。AES 和 DES 是强大的加密标准,但它们仅专注于保密性,没有内置机制来验证数据完整性。

Fernet 集成了加密和认证,简化了实现过程,并提高了整体安全性能。它消除了对额外 HMAC(基于哈希的消息认证码)实现的需求,使其成为数据完整性至关重要的首选。

此外,Fernet 加密数据的标准化结构有助于在不同系统和平台之间的互操作性,确保在各种环境中的无缝集成和通信。

开始使用 Cryptography

安装

在深入研究 Fernet 加密之前,第一步是在 Python 中安装 cryptography 库。安装过程很简单,可以使用 Python 的包管理器 pip 完成。步骤如下:

打开终端或命令提示符: 根据您的操作系统,打开终端或命令提示符。

安装 cryptography: 使用以下命令安装 cryptography 库:

此命令将下载并安装 cryptography 包及其依赖项。

密钥生成是 Fernet 加密的基础,因为它依赖于秘密密钥来安全地加密和解密数据。在 Fernet 中,cryptography 库简化了密钥生成过程。

以下是使用 Python cryptography 库生成密钥的说明:

导入 Fernet 模块

创建密钥

Fernet.generate_key() 方法创建一个随机的 256 位(32 字节)密钥,用于加密和解密。

生成的密钥是一个 bytes 对象,其中包含 Fernet 加密算法所需的秘密密钥。

存储密钥

安全地存储生成的密钥至关重要。此密钥作为加密和解密数据的关键组件。最佳实践包括将其存储在安全位置,远离加密数据,确保限制访问。

使用 Fernet.generate_key() 生成的密钥应保持机密,仅供授权人员或系统访问。确保密钥保持安全对于维护加密数据的完整性和保密性至关重要。

在使用 Python cryptography 库实现 Fernet 加密时,将使用几种方法进行密钥生成、加密和解密。以下是所用方法的细分:

密钥生成

Fernet.generate_key()

此方法负责生成 Fernet 加密算法使用的秘密密钥。

语法

返回值: 一个随机生成的 256 位(32 字节)密钥,编码为 bytes。

加密

  • Fernet(key)

用于创建 Fernet 对象的构造函数方法。

  • 语法:Fernet(key)
  • 参数: key - 为加密生成的秘密密钥。
  • 返回值: 一个 Fernet 对象,将用于加密和解密。

cipher_suite.encrypt(data)

使用 Fernet 对象加密提供的数据。

  • 语法:cipher_suite.encrypt(data)
  • 参数:data - 要加密的明文消息,以 bytes 格式。
  • 返回值:加密后的数据,以 bytes 格式。

解密

  • decrypt(encrypted_data)
  • 使用 Fernet 对象和密钥解密加密的数据。
  • 语法:cipher_suite.decrypt(encrypted_data)
  • 参数:encrypted_data - 要解密的密文,以 bytes 格式。
  • 返回值:解密后的明文,以 bytes 格式。

总体流程

密钥生成

Fernet.generate_key() 生成一个编码为 bytes 的随机密钥。

加密

Fernet(key) 使用生成的密钥创建一个 Fernet 对象。

cipher_suite.encrypt(data) 使用 Fernet 对象加密明文数据。

解密

cipher_suite.decrypt(encrypted_data) 使用相同的 Fernet 对象和密钥解密密文,得到原始明文。

这些方法协同工作,为 Fernet 中的整个加密和解密过程提供便利。秘密密钥的生成、Fernet 对象的创建以及随后的加密和解密方法对于保护和保护敏感数据至关重要。

在 cryptography 库的 Fernet 加密中,将使用一些参数和方法,在密钥生成、加密和解密过程中具有特定用途。

密钥生成

无参数

Fernet.generate_key() 方法不接受任何参数。

生成一个 256 位(32 字节)的随机密钥,编码为 bytes。

加密

Fernet(key)

  • 参数: key (bytes)
  • Fernet 构造函数将生成的密钥作为参数。

cipher_suite.encrypt(data)

  • 参数: data (bytes)
  • 加密提供的明文数据(以 bytes 格式)。

解密

cipher_suite.decrypt(encrypted_data)

  • 参数:encrypted_data (bytes)
  • 解密提供的密文数据(以 bytes 格式)。

Fernet 加密中的安全注意事项

密钥管理

密钥存储: 将加密密钥保存在安全的位置。使用专用的密钥管理系统来存储和管理密钥,防止未经授权的访问。

密钥轮换: 定期轮换密钥以减轻长期密钥暴露带来的风险。此实践可减少漏洞并提高安全性。

访问控制: 实施严格的访问控制,将密钥访问限制为仅授权人员,从而最大程度地减少密钥被泄露的可能性。

算法更新

保持更新: 密切关注与 Fernet 加密算法和 cryptography 库相关的更新和安全补丁。定期更新库以利用最新的安全增强功能和修复。

安全审计: 定期进行安全审计,以评估加密实现的健壮性,确保符合最佳实践和安全标准。

数据完整性和真实性

消息认证: Fernet 的认证加密通过包含消息认证码 (MAC) 来确保数据完整性。确保在解密过程中始终执行 MAC 验证以确认数据的真实性。

检测篡改: 监控并检测任何篡改加密数据的尝试。检测到的对加密数据的任何更改都应触发警报或进行调查。

安全传输和存储

安全通道: 使用安全通信协议(例如 TLS/SSL)在网络上安全地传输加密数据。安全传输可防止在传输过程中被窃听和未经授权访问敏感信息。

安全存储: 将加密数据安全地存储在数据库或文件中。考虑额外的安全措施,例如访问控制和存储介质的加密,以增强数据保护。

避免密钥泄露

密钥处理: 限制加密密钥的暴露。避免在代码中硬编码密钥或将其存储在纯文本配置文件中。而是使用安全的密钥存储机制和访问控制。

密钥共享: 在系统或人员之间共享密钥时要小心。使用安全的密钥交换方法,如果需要,可以考虑使用非对称加密进行密钥共享。

符合标准

监管合规性: 确保遵守数据保护法规(例如 GDPR、HIPAA)和行业特定标准。Fernet 加密通过为敏感数据保护提供强大的安全措施来支持遵守这些法规。

持续监控和响应

监控系统: 实施监控系统以检测与加密过程相关的异常或潜在的安全漏洞。及时响应和调查任何涉及加密数据的安全事件。

教育和培训

意识计划: 进行培训会议,教育员工了解安全的加密实践,强调安全的密钥管理和加密协议的重要性。

Fernet 加密的实现

生成密钥

生成强密钥对于 Fernet 加密至关重要。

密钥生成过程

Fernet.generate_key() 方法生成 Fernet 加密使用的秘密密钥。这个 256 位(32 字节)的密钥对于加密和解密操作都至关重要。

密钥安全注意事项

确保生成密钥的安全存储和管理。

避免共享或泄露密钥,仅限于授权人员/系统访问。

加密数据

加密敏感信息涉及 Fernet 对象和生成的密钥。

加密过程

生成密钥后,明文数据的加密过程如下:

加密步骤

使用生成的密钥创建 Fernet 对象(cipher_suite)。

使用 cipher_suite.encrypt() 方法加密明文消息。

解密数据

解密加密数据需要使用与加密相同的密钥。

解密过程

要从加密数据中恢复原始明文,请执行以下操作:

解密步骤

使用相同的 Fernet 对象(cipher_suite)和密钥解密 cipher_text。

恢复原始明文 decrypted_text。

处理解密错误

处理潜在的解密错误至关重要,例如 cryptography.fernet.InvalidToken,这可能是由于密钥不正确或数据被篡改引起的。适当的错误处理可确保解密过程的可靠性。

阐述 Fernet 加密中涉及的密钥生成、加密和解密的技术和过程,可以更清晰地理解它们的实现,并强调安全密钥管理对数据保护的重要性。

实施

输出

The Generated Key is: b'ldTN5Q0NwiwIXvKVtm1EchL8JGMI-e7SOnSs1x5-3aE='
The Plaintext Message is: b'Sensitive information here!'
The converted Ciphertext is: b'gAAAAABhOzlh-dHW2CjA5Q27df0wN6Mm0TfE0Qa7hrvIv0LZKJ3WOr3KvGlmdwcCoX4oWWHZeppnQX6OTLXVIX3fSDovNlQUkg=='

说明

Fernet 密钥使用 Fernet.generate_key() 方法生成。此密钥是随机生成的 256 位密钥,采用 URL 安全的 base64 格式编码。此密钥对于加密和解密过程都至关重要,构成了安全机制的基础。

然后,使用生成的密钥初始化 Fernet 对象 cipher_suite。此对象将负责使用 Fernet 对称加密算法加密和解密数据。

定义了明文消息,用 plaintext_message 表示。它包含要加密的敏感信息。在此情况下,它表示为 bytes(b"Sensitive data here!")。

cipher_suite.encrypt(plaintext_message) 使用 Fernet 对象(cipher_suite)加密明文消息。此过程会生成密文,它代表原始明文消息的加密形式。

最后,代码使用 print 语句显示生成的 Fernet 密钥(key)、原始明文消息(plaintext_message)以及生成的密文(ciphertext)。这允许您观察生成的密钥以及使用 Fernet 加密将明文转换为密文的过程。