Python如何实现文件加密?cryptography

python中使用cryptography库的fernet模块实现文件加密具有简单、安全、高效的优势,1. 优势包括:易用性高,无需掌握底层加密细节;内置aes-128-cbc和hmac-sha256,保障机密性、完整性与真实性;支持时效性令牌,可设置加密数据过期;2. 局限在于:为对称加密,存在密钥分发难题;灵活性低,不支持自定义算法模式;不原生支持大文件流式加密,需手动分块处理;3. 密钥管理建议:避免硬编码,优先使用环境变量、受限权限的密钥文件、操作系统密钥环或云kms服务;4. 其他加密选择:pycryptodome提供更细粒度控制,适合高级需求;gpg/pgp适用于非对称加密场景;哈希函数仅用于校验完整性,不可用于加密。综上,fernet是文件加密的理想起点,适合大多数常规场景,而复杂需求可选用pycryptodome或gpg方案。

Python如何实现文件加密?cryptography

用Python实现文件加密,尤其是利用

cryptography

库,其实比很多人想象的要直接和方便。核心思想就是使用一个密钥将原始数据转换成不可读的密文,需要时再用同一个密钥解密回去。这其中,

cryptography

库提供的Fernet对称加密方案,简直是为这类需求量身定制的,它已经把很多加密细节和最佳实践封装好了,让我们可以更专注于业务逻辑。

解决方案

要用Python的

cryptography

库实现文件加密,我们通常会用到其中的

Fernet

模块。Fernet是一种对称加密方案,它结合了AES(高级加密标准)和HMAC(基于哈希的消息认证码),确保了数据的机密性和完整性。整个流程大致是:生成一个密钥,用这个密钥加密文件内容,解密时再用同样的密钥。

1. 生成并保存密钥:加密的第一步是生成一个安全的密钥。这个密钥是加密和解密的唯一凭证,它的安全至关重要。

from cryptography.fernet import Fernetdef generate_key():    """生成一个Fernet密钥并返回"""    key = Fernet.generate_key()    return keydef save_key(key, filename="filekey.key"):    """将生成的密钥保存到文件中"""    with open(filename, "wb") as key_file:        key_file.write(key)def load_key(filename="filekey.key"):    """从文件中加载密钥"""    return open(filename, "rb").read()# 示例:生成并保存密钥# key = generate_key()# save_key(key)# print(f"密钥已生成并保存到 filekey.key: {key.decode()}")

2. 加密文件:有了密钥之后,就可以用它来加密文件内容了。我们需要读取文件的二进制内容,然后使用

Fernet

对象进行加密。

from cryptography.fernet import Fernetimport osdef encrypt_file(filepath, key):    """使用给定的密钥加密文件"""    f = Fernet(key)    with open(filepath, "rb") as file:        original_data = file.read()    encrypted_data = f.encrypt(original_data)    # 将加密后的数据写入新文件,通常会加上.encrypted后缀    encrypted_filepath = filepath + ".encrypted"    with open(encrypted_filepath, "wb") as encrypted_file:        encrypted_file.write(encrypted_data)    print(f"文件 '{filepath}' 已加密为 '{encrypted_filepath}'")    return encrypted_filepath# 示例:创建一个测试文件并加密# test_content = b"This is some secret information I want to encrypt."# with open("my_secret_doc.txt", "wb") as f:#     f.write(test_content)## # 假设你已经通过 load_key() 加载了密钥# # key = load_key() # # encrypted_file_path = encrypt_file("my_secret_doc.txt", key)

3. 解密文件:解密过程是加密的逆操作。同样使用同一个密钥,通过

Fernet

对象将密文还原成原始数据。

from cryptography.fernet import Fernetdef decrypt_file(encrypted_filepath, key):    """使用给定的密钥解密文件"""    f = Fernet(key)    with open(encrypted_filepath, "rb") as file:        encrypted_data = file.read()    decrypted_data = f.decrypt(encrypted_data)    # 将解密后的数据写入新文件,通常会去掉.encrypted后缀或另存为    original_filepath = encrypted_filepath.replace(".encrypted", ".decrypted")    with open(original_filepath, "wb") as decrypted_file:        decrypted_file.write(decrypted_data)    print(f"文件 '{encrypted_filepath}' 已解密为 '{original_filepath}'")    return original_filepath# 示例:解密之前加密的文件# # 假设你已经通过 load_key() 加载了密钥# # key = load_key()# # decrypted_file_path = decrypt_file(encrypted_file_path, key)

实际操作中,你需要确保密钥的生成、保存和加载逻辑是连贯且安全的。我个人觉得,对于简单场景,把密钥存到一个独立的、受保护的文件里,或者通过环境变量加载,已经是一个不错的开始了。

立即学习“Python免费学习笔记(深入)”;

Python文件加密中,Fernet加密方式有何优势与局限?

说起

cryptography

库里的Fernet,我个人是挺喜欢它的,因为它把很多加密的复杂性都给抽象掉了,用起来特别顺手。它的主要优势在于:

简单易用性: 这是最显著的特点。你不需要深入了解AES、CBC模式、HMAC等底层细节,只需生成一个密钥,然后用它来加密/解密数据就行。这对于大多数开发者来说,大大降低了安全编程的门槛。安全性考量: Fernet不是简单的算法堆砌,它是一个经过精心设计的、包含了多种安全原语的方案。它默认使用了AES-128的CBC模式进行加密,并结合了HMAC-SHA256进行消息认证,这意味着它不仅保证了数据的机密性(别人看不到),也保证了数据的完整性(数据没有被篡改)和真实性(数据确实是密钥持有者加密的)。它甚至还内置了nonce(一次性随机数)管理,避免了重放攻击等问题。时效性令牌: Fernet的加密数据本身就包含了一个时间戳,这意味着你可以设置加密数据在一段时间后失效。这对于一些需要时效性访问的场景非常有用,比如一次性链接或者临时授权。

但话说回来,光说优点不提缺点也不现实,Fernet当然也有它的局限性:

对称加密的固有问题: 最大的局限性在于它是对称加密。这意味着加密和解密使用的是同一个密钥。这带来了一个经典的“密钥分发”问题:你怎么安全地把这个密钥给到需要解密的人?如果密钥泄露了,所有被加密的数据都将面临风险。这事儿吧,搞不好就出事了。灵活性相对较低: 相比于

PyCryptodome

这种提供更底层加密算法接口的库,Fernet的封装度很高,它给你的是一个“开箱即用”的解决方案。如果你需要更精细地控制加密算法、模式(比如AES-GCM)、填充方式等,Fernet可能就不太适合了。它更像是为你提供了一把“万能钥匙”,而不是一整套“锁匠工具”。不直接支持流式加密: 对于非常大的文件,一次性将整个文件读入内存进行加密可能会导致内存溢出。Fernet本身设计上更偏向于处理大小适中的数据块。虽然可以通过分块读取、加密再拼接的方式实现,但这就需要额外的逻辑来处理了,不像一些专门为流式加密设计的方案那么直接。

总的来说,Fernet是Python文件加密的绝佳起点,尤其适合那些对加密细节不求甚解,只希望快速、安全地实现数据保护的场景。

如何安全地管理和存储加密密钥?

密钥管理,这绝对是加密中最头疼、也最关键的一环。加密算法再强,密钥不安全,那一切都是白搭。我个人觉得,密钥管理比加密本身更考验技术和经验。

避免硬编码: 这是最基本的原则,也是最容易犯的错误。把密钥直接写在代码里,简直就是把金库的钥匙贴在金库门上。代码一旦泄露,密钥也就泄露了。环境变量: 对于服务器端的应用,将密钥存储在操作系统的环境变量中是一个比较常见的做法。比如

export MY_ENCRYPTION_KEY="your_super_secret_key_here"

。程序启动时从环境变量读取。优点是简单易行,不需要额外的文件或服务;缺点是如果服务器被攻破,环境变量也可能被读取。而且,重启服务器可能需要重新设置。配置文件(加密): 可以将密钥存储在一个单独的配置文件中,但这个配置文件本身也需要加密,或者至少设置严格的访问权限。比如,使用操作系统的文件权限(

chmod 600 filekey.key

)来限制只有特定用户才能读取。这种方式比环境变量更持久,但同样面临文件被读取的风险。操作系统密钥环服务(Keyring Services): 这是一个更专业的选择。像macOS的Keychain、Windows的Credential Manager或者Linux的Secret Service (GNOME Keyring, KDE Wallet) 都提供了安全的密钥存储机制。Python有

keyrings.alt

这样的库可以与这些服务交互。这样密钥就被操作系统管理,通常会受到用户登录密码或生物识别的保护。这玩意儿用起来稍微复杂一点,但安全性提升不少。硬件安全模块(HSM)/云密钥管理服务(KMS): 这是最高级别的密钥管理方案,但通常也最复杂、成本最高。HSM是专门用于存储和管理加密密钥的物理设备,密钥永远不会离开HSM。云服务提供商(如AWS KMS, Google Cloud KMS, Azure Key Vault)也提供了类似的托管服务,让你可以集中管理和使用加密密钥,而无需自己处理底层的硬件和安全问题。对于企业级应用,这几乎是标配。用户输入/密码派生: 如果是桌面应用或者用户需要自己记住密钥,可以引导用户输入一个密码,然后使用密码派生函数(如PBKDF2、scrypt或argon2)从这个密码派生出真正的加密密钥。这样用户只需要记住一个相对容易记忆的密码,而实际的加密密钥是强随机的,且不会直接存储。当然,用户忘记密码就没法解密了。

总结一下,没有绝对安全的密钥管理方案,只有相对更安全的。选择哪种方式,取决于你的应用场景、安全需求以及能投入的资源。对于个人或小型项目,环境变量或受限权限的密钥文件可能就够了;而对于涉及到大量敏感数据或合规性要求的场景,密钥环服务或KMS会是更好的选择。

除了Fernet,Python还有哪些加密文件的选择?

除了

cryptography

库的Fernet,Python生态系统里还有其他一些库和方法可以实现文件加密,它们各有侧重,适用于不同的场景。我个人觉得,了解这些选项能让你在面对具体需求时有更多的选择余地。

PyCryptodome:这是Python中一个非常强大且功能全面的加密库,可以说是

cryptography

库的有力补充,甚至在某些方面提供了更底层的控制。如果你需要实现非对称加密(比如RSA),或者想使用AES的不同模式(如GCM模式,它能同时提供认证加密),或者需要更细粒度的控制,

PyCryptodome

会是你的首选。它的优点在于提供了几乎所有主流的加密算法和模式,你可以根据自己的需求组合使用。但缺点是,相较于Fernet,它的使用门槛更高一些,你需要对加密算法和模式有更深入的理解,才能正确地使用它,避免踩坑。比如,使用AES时,你需要自己管理IV(初始化向量)和填充方式。

GPG/PGP(通过Python包装器):GPG(GNU Privacy Guard)是PGP(Pretty Good Privacy)的开源实现,它是一个非常成熟和广泛使用的加密工具,主要用于文件加密、签名和电子邮件加密。Python本身没有内置GPG的功能,但有很多第三方库(比如

python-gnupg

)可以作为GPG的包装器,让你在Python代码中调用GPG的功能。这种方式的优点是,GPG本身非常健壮和安全,并且支持非对称加密(公钥/私钥对),可以实现更灵活的密钥管理和分发。你可以用一个公钥加密文件,然后只有持有对应私钥的人才能解密。缺点是,它依赖于系统上安装的GPG程序,并且使用起来相对复杂,需要理解GPG的密钥环管理、信任模型等概念。对于简单的文件加密需求,可能有点“杀鸡用牛刀”的感觉。

哈希函数(Hash Functions):虽然哈希函数(如SHA256、MD5等)常被提及,但需要明确的是,哈希函数不是加密! 它是一种单向函数,可以将任意长度的数据映射成固定长度的哈希值。这个过程是不可逆的,也就是说,你无法从哈希值还原出原始数据。哈希主要用于数据完整性校验(确保文件在传输或存储过程中没有被篡改)和密码存储(存储密码的哈希值而不是明文)。如果你只是想保护文件不被篡改,哈希是一个好选择;但如果你想让文件内容变得不可读,那就必须用加密。

在我看来,如果你是初学者或者追求快速实现安全加密,

cryptography

库的Fernet绝对是首选,它已经为你处理了大部分复杂性。但如果你的项目有更复杂的加密需求,比如需要非对称加密、特定的加密模式,或者需要与现有的GPG系统集成,那么

PyCryptodome

或GPG包装器就会派上用场了。选择哪个,真的要看你的具体需求和对加密知识的掌握程度。

以上就是Python如何实现文件加密?cryptography的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1367112.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python怎样实现数据关联规则?Apriori算法
上一篇 2025年12月14日 07:07:53
Python如何操作Apache Cassandra?cassandra-driver优化
下一篇 2025年12月14日 07:08:04

相关推荐

  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    000
  • Java javac 命令与当前工作目录解析

    在Java编译环境中,javac命令的“当前目录”指的是命令被执行的物理位置,而非源文件所在的目录。理解这一概念对于正确配置和管理Java项目的编译路径至关重要,特别是当默认的classpath设置为.时,它决定了编译器查找类文件的起点。 1. javac 命令与当前工作目录的定义 在操作系统中,当…

    2026年9月23日
    000
  • 苹果 iPhone Air 今日正式发售:仅支持 eSIM,起售价 7999 元

    10 月 22 日消息,苹果全新 iphone air 于今日上午 8:00 正式开售,起售价定为 7999 元。值得关注的是,该机型仅支持 esim 功能,用户需持本人有效身份证件前往运营商实体营业厅完成实名核验与服务激活。现阶段仍处于商用试验阶段,暂未开放线上办理通道。 iPhone Air 搭…

    2026年9月23日
    100
  • VSCode调试JavaScript代码(详细图解,前端必学技能)

    掌握VSCode调试JavaScript需先安装Node.js和VSCode,创建项目及app.js文件后,配置launch.json,设置断点并启动调试,通过变量面板和控制台检查值,结合条件断点、日志点、监听表达式等技巧提升效率;调试浏览器代码需安装Chrome或Edge调试插件,配置url和we…

    2026年9月23日
    000
  • 电脑视频号直播如何拼屏?直播拼屏有什么用?

    在电脑端进行视频号直播时,使用拼屏功能可以显著增强内容的丰富度与观众的观看体验。通过将多个画面组合展示,直播更具层次感和互动性。那么,具体该如何实现电脑视频号直播的拼屏呢? 一、电脑视频号直播拼屏操作步骤 前期准备:确保电脑性能良好,满足直播流畅运行的需求;下载并安装最新版本的视频号直播助手工具;准…

    2026年9月23日
    200
  • Bash Shell 中单引号和双引号的区别

    Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别

    在 linux 命令行中,引号是处理文件名中的空格和特殊字符的常用工具。引号在 shell 脚本中具有“特殊功能”,可能让初学者感到困惑。让我们详细探讨不同类型的引号字符及其在 shell 脚本中的用法。 有四种不同类型的引号字符: 单引号 ‘双引号 “反斜杠 反引号 ` 除…

    2026年9月23日 用户投稿
    000
  • 三星A系列微信收款语音播报怎么设置?快速启用语音的详细教程

    要设置三星A系列手机微信收款语音播报,需先开启微信内“收款到账语音提醒”,再在系统设置中确保微信通知权限全开,并关闭勿扰模式、调高媒体音量。同时检查电池优化设置,避免后台限制,保持微信更新,确保系统资源充足,方可稳定播报。 三星A系列手机要设置微信收款语音播报,其实核心就两步:一是确保微信内部功能开…

    2026年9月23日
    000
  • UC浏览器官方网页版登录入口 UC浏览器最新官网链接

    UC浏览器官方网页版登录入口在官网https://www.ucweb.com/,点击顶部“网页版”选项并登录账号即可使用。 UC浏览器官方网页版登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来UC浏览器最新官网链接,想了解UC浏览器功能特点的网友一起随小编来瞧瞧吧! https:/…

    2026年9月23日
    700
  • windows11如何查看和导出事件查看器日志_windows11事件日志导出方法

    首先打开事件查看器,通过Win+R输入eventvwr.msc或右键开始菜单进入;接着在Windows日志中查看系统、安全和应用程序日志,双击事件查看详情;然后可按级别、来源或时间筛选日志;最后右键日志类型选择“将所有事件另存为”,支持.evtx、.txt或.csv格式导出文件用于分析或存档。 如果…

    2026年9月23日
    600
  • Linux中如何查看服务日志?journalctl与syslog使用指南

    Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南

    排查linux服务问题时,首选journalctl或syslog类系统查看日志。journalctl适用于systemd系统,可查看内核消息、服务启动输出等,支持按时间、单元、优先级过滤;syslog适用于传统系统,需服务主动发送日志,支持集中管理。掌握两者使用能有效定位问题。 在Linux系统中排…

    2026年9月23日 用户投稿
    100
  • Java语法基础中main方法为什么必须是public static void

    Main方法必须声明为public static void以确保JVM能无访问限制地通过类名直接调用,且不依赖对象实例或返回值,符合JVM规范对程序入口的强制要求。 Main方法是Java程序的入口点,它的标准声明形式为:public static void main(String[] args)。…

    2026年9月23日
    100
  • mysql安装后怎么授权 mysql用户权限设置操作教程

    mysql安装后怎么授权 mysql用户权限设置操作教程mysql安装后怎么授权 mysql用户权限设置操作教程mysql安装后怎么授权 mysql用户权限设置操作教程mysql安装后怎么授权 mysql用户权限设置操作教程

    创建用户并授权需用create user和grant命令,常见权限包括select、insert、update、delete、create、drop和all privileges,修改权限可用grant或revoke,设置时应注意作用范围、远程访问限制和密码安全。1. 创建用户使用create us…

    2026年9月23日 用户投稿
    800
  • ElevenLabs的AI混合工具怎么用?生成逼真语音的详细操作教程

    ElevenLabs的AI混合工具核心在于VoiceLab功能,结合Voice Design与Instant Voice Cloning实现声音的精细调控与克隆。通过参数调整和高质量音频输入,用户可从零设计或克隆声音,并经反复迭代优化情感表达与自然度。其优势在于对声音细节的精准控制、克隆的真实感及灵…

    2026年9月23日
    100
  • 优化 Laravel Nova 动作响应消息的持久性与交互性

    本文探讨了 Laravel Nova 动作响应消息(toast 提示)持续时间过短的问题,尤其对于耗时较长的操作,默认提示难以满足用户反馈需求。我们提出并详细介绍了如何利用 Laravel Nova 4 的通知功能,实现持久化且可交互的用户通知,从而有效解决传统 toast 消息的局限性,提升用户体…

    2026年9月23日
    100
  • Reflection AI 完成 20 亿美元融资,打造“开放智能”

    美国人工智能初创企业 reflection ai 宣布成功募集 20 亿美元资金,其中英伟达领衔投资 8 亿美元,推动公司估值跃升至 80 亿美元。这家成立仅一年的科技新星,致力于打造“人人可及的前沿开放智能(open intelligence)”。 Reflection AI 表示,已集结一支由顶…

    2026年9月23日
    500
  • win11开机PIN码登录选项消失了怎么办_win11PIN码登录选项丢失修复方法

    首先尝试切换登录方式重置PIN,若无效则通过命令提示符启用管理员账户,再检查本地组策略设置并清除NGC文件夹以重建PIN凭据,最终恢复PIN登录功能。 如果您尝试在Windows 11开机时使用PIN码登录,却发现登录选项中缺少PIN码入口,这通常是由系统临时故障、策略设置或账户同步问题导致的。此问…

    2026年9月23日
    000
  • mysql安装完如何优化 mysql基础性能调优配置建议

    mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议mysql安装完如何优化 mysql基础性能调优配置建议

    安装完 mysql 后需进行基础配置调优以提升性能,主要包括以下五点:1. 设置 innodb_buffer_pool_size 为物理内存的50%~80%,如16g内存可设为12g;2. 调整 max_connections 至合理并发数如500,并设置 wait_timeout 和 intera…

    2026年9月23日 用户投稿
    400
  • [272]如何把Python脚本导出为exe程序

    [272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序[272]如何把Python脚本导出为exe程序

    文章目录:一. PyInstaller简介二. PyInstaller在Windows下的安装三. 打包四. 小实例(Windows下) 附加:pyinstaller简介 PyInstaller能够将Python脚本打包成可执行程序,使得在没有Python环境的机器上也可以运行这些程序。 PyIns…

    2026年9月23日 用户投稿
    100
  • 微信小店客服怎么联系?微信小店官方平台电话

    随着移动互联网的发展,微信已经成为人们日常生活中不可或缺的工具。作为微信生态中的重要功能之一,微信小店为用户提供了便捷的购物方式。然而在实际使用过程中,难免会遇到一些问题,例如订单异常、商品咨询等,这时候就需要及时联系微信小店的客服人员进行解决。本文将为您详细介绍如何联系微信小店官方客服,并提供多种…

    2026年9月23日
    000
  • VSCode搭建Flutter开发环境(移动开发,完整配置指南)

    本文详细指导如何在VSCode中搭建高效的Flutter开发环境,包括安装JDK、配置JAVA_HOME、安装Android Studio并设置ANDROID_HOME、安装VSCode及Flutter和Dart插件、配置FLUTTER_HOME环境变量,通过flutter doctor检查并解决A…

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信