PDFBOX 安全性不起作用

chi*_*iku 0 pdf security pdf-generation pdfbox

我正在使用 PDFBOX - 1.8.13,似乎 PDF Security 没有按预期工作。如果设置了所有者密码而未设置用户密码,如果我不提供所有者密码,PDFBOX 允许解密我的 PDF 文件。请帮助我做错的地方。

加密我的pdf文件的代码:

PDDocument document = PDDocument.load(new File("/home/dummy/dummy.pdf"),null);

AccessPermission perms = new AccessPermission();
perms.setCanAssembleDocument(false);;
perms.setCanExtractContent(false);
perms.setCanModify(false);
perms.setCanModifyAnnotations(false);
perms.setCanExtractForAccessibility(false);
perms.setCanFillInForm(false);

perms.setCanPrint(false);
perms.setReadOnly();
perms.setCanPrintDegraded(false);
perms.setCanExtractForAccessibility(false);

document.setAllSecurityToBeRemoved(false);

StandardProtectionPolicy policy = new StandardProtectionPolicy("AdminPasswordTest", "", perms);
policy.setPermissions(perms);

document.protect(policy);

document.save("/home/dummy/dummy_secured.pdf"); 

document.close();
Run Code Online (Sandbox Code Playgroud)

解密我的 PDF 的代码

PDDocument doc = PDDocument.load("/home/dummy/dummy_secured.pdf", true);

if (doc.isEncrypted()) { //remove the security before adding protections
    doc.decrypt(""); //This should not be DECRYPTED because owner password is not provided
    doc.setAllSecurityToBeRemoved(true); //This user is not provided this permissions
}
doc.save("/home/dummy/dummy_decrypted.pdf");
doc.close();
Run Code Online (Sandbox Code Playgroud)

mkl*_*mkl 5

PDF 安全性似乎没有按预期工作。

在这种情况下,你需要调整你的期望。;)

这就是 PDF 密码加密的有效工作原理:

  • 用户密码是实际用于加密和解密的密码。
  • 所有者密码允许访问 PDF 中的用户密码(预处理版本),然后可用于解密文档。

因此,您用于加密的空用户密码“”是任何人解密 PDF 所需的所有密码。

使用所有者密码而不是用户密码还可以让您解密 PDF(参见上文,它允许 PDF 处理器检索用户密码,然后继续解密文件),并另外告诉 PDF 处理器您是该 PDF 的所有者。文档,因此不应受到当前文档中未给出的任何权限的限制。

PDF 库通常要么根本不关心权限(AFAIK PDFBox 不关心),要么由于缺少所有者密码而有一个开关来覆盖限制(例如 iText)。

因此,使用空用户密码加密 PDF(以限制权限,同时允许任何人打开文件)是一个非常容易克服的障碍。