脚本专家 发表于 7 天前

Python实现PDF加密解密:RC4/AES-128/AES-256算法与权限控制详解

在企业文档管理和信息安全中,PDF文档的加密保护是常见需求。手动为每份文件设置密码不仅低效,还难以集成到自动化流程中。Python结合Spire.PDF库,可以编程实现PDF文档的加密、权限控制和解密操作,将安全策略标准化并嵌入文档处理管线。


pip install Spire.PDF


导入模块:

from spire.pdf import *


PDF加密体系中有几个关键概念:用户密码(打开文档)、所有者密码(控制权限)、加密算法(RC4/AES)以及文档权限(打印、复制等)。这些设置通过PdfPasswordSecurityPolicy类管理。

1. 使用RC4算法加密PDF

以下示例采用RC4-128位加密,设置用户密码和所有者密码,并开放打印和填写表单权限:

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("input.pdf")

securityPolicy = PdfPasswordSecurityPolicy("open", "test")
securityPolicy.EncryptionAlgorithm = PdfEncryptionAlgorithm.RC4_128

dp = PdfDocumentPrivilege.ForbidAll()
dp.AllowPrint = True
dp.AllowFillFormFields = True
securityPolicy.DocumentPrivilege = dp

doc.Encrypt(securityPolicy)
doc.SaveToFile("Encrypted_RC4.pdf")


权限控制采用"默认禁止、逐项放行"的安全策略,避免遗漏未显式禁止的权限。

2. 使用AES-128加密提高安全等级

AES是目前广泛认可的加密算法。Spire.PDF支持AES-128和AES-256。使用时需注意用户密码长度至少8个字符,否则可能失败:

from spire.pdf import *

pdfDocument = PdfDocument()
pdfDocument.LoadFromFile("input.pdf")

securityPolicy = PdfPasswordSecurityPolicy("123456789", "M123456789")
securityPolicy.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES_128

securityPolicy.DocumentPrivilege = PdfDocumentPrivilege.ForbidAll()
securityPolicy.DocumentPrivilege.AllowPrint = True

pdfDocument.Encrypt(securityPolicy)
pdfDocument.SaveToFile("Encrypted_AES128.pdf")
pdfDocument.Close()


3. 使用AES-256进行高级别加密

对于敏感数据,AES-256提供最高级别保护。以下代码不设置用户密码(空字符串),仅设置所有者密码,允许低分辨率打印和填写表单:

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("input.pdf")

securityPolicy = PdfPasswordSecurityPolicy("", "test")
securityPolicy.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES_256

dp = PdfDocumentPrivilege.ForbidAll()
dp.AllowDegradedPrinting = True
dp.AllowFillFormFields = True
securityPolicy.DocumentPrivilege = dp

doc.Encrypt(securityPolicy)
doc.SaveToFile("Encrypted_AES256.pdf")


AllowDegradedPrinting与AllowPrint的区别:降级打印以低分辨率输出,可防止高质量复制,适合保护知识产权内容。

4. 解密PDF文档

解密需要知道所有者密码,加载时传入密码参数,再调用Decrypt():

from spire.pdf import *

doc = PdfDocument()
doc.LoadFromFile("Encrypted_RC4.pdf", "test")
doc.Decrypt()
doc.SaveToFile("Decrypted.pdf")


如果使用用户密码打开文档,解密时还需额外提供所有者密码:

doc.LoadFromFile("Encrypted_RC4.pdf", "open")
doc.Decrypt("test")
doc.SaveToFile("Decrypted.pdf")


解密后的PDF不再受密码和权限限制。

5. 可用权限一览

PdfDocumentPrivilege支持的常用权限属性:

AllowPrint - 允许高质量打印
AllowDegradedPrinting - 允许降级(低分辨率)打印
AllowCopy - 允许复制文档内容
AllowFillFormFields - 允许填写表单字段
AllowModifyContents - 允许修改文档内容
AllowComment - 允许添加注释

合理组合权限,可制定差异化安全策略。例如客户报告可允许打印但禁止复制,内部表单允许填写但禁止修改其他内容。

6. 实用技巧

- 加密算法选择:RC4-128兼容旧版阅读器;AES-128满足大部分日常需求;AES-256适用于高度敏感文档。
- 批量加密:结合os或pathlib模块遍历文件夹,对每个文件应用相同安全策略,密码通过环境变量或配置文件管理,避免硬编码。
- 密码管理:生产环境中使用环境变量、配置文件或密钥管理服务存储密码,降低泄露风险。

本文完整演示了使用Python对PDF进行RC4、AES-128、AES-256三种加密及解密的方法,包括用户密码、所有者密码和文档权限的配置。这些功能可集成到自动化报告生成、文档安全管理等场景中。结合水印、文本替换等功能,可构建更完善的文档安全自动化方案。

热心网友7 发表于 7 天前

Re: Python实现PDF加密解密:RC4/AES-128/AES-256算法与权限控制详解

感谢分享,教程非常详尽!RC4/AES不同算法和权限控制的组合讲得很清楚,尤其是 `AllowDegradedPrinting` 和 `AllowPrint` 的区别,之前没注意过这个细节。批量加密配合环境变量管理密码的思路也很实用,正好在做一个文档自动化项目,这部分可以参考集成。有个小问题:Spire.PDF 这个库在商业环境中使用时有没有授权限制?还是说社区版就够用了?

热心网友7 发表于 7 天前

Re: Python实现PDF加密解密:RC4/AES-128/AES-256算法与权限控制详解

感谢楼主分享这么详细的教程!之前还在为手动加密PDF发愁,这个自动化方案太实用了。特别是权限控制里那个“默认禁止、逐项放行”的思路,确实比直接设置权限更安全,可以避免遗漏。另外 AES-256 那个只设所有者密码、不设用户密码的场景,很适合公司内部共享文档,既保证权限控制又方便打开。想问下楼主,批量加密时如果密码用环境变量加载,出现中文密码会不会有编码问题?

热心网友7 发表于 7 天前

Re: Python实现PDF加密解密:RC4/AES-128/AES-256算法与权限控制详解

这篇教程写得很清晰,从三种加密算法到权限控制再到批量处理思路,基本覆盖了PDF加密的实用场景。尤其“默认禁止、逐项放行”的权限设计思路很值得学习,能有效避免意外开放权限。有个小疑问想请教楼主:在生产环境中使用环境变量或配置文件管理密码时,Spire.PDF库是否有任何已知的性能瓶颈或并发安全问题?另外,批量解密时如果遇到密码不统一的情况,作者有没有比较好的容错处理思路?感谢分享。
页: [1]
查看完整版本: Python实现PDF加密解密:RC4/AES-128/AES-256算法与权限控制详解