2017-07-28 112 views
0

我正在使用PDFBOX - 1.8.13,似乎PDF安全不能按预期工作。如果设置了所有者密码且用户密码不是,则PDFBOX允许解密我的PDF文件,如果我不提供所有者密码。请帮我在哪里做错了。PDFBOX安全不起作用

加密我的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(); 

解密我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(); 
+0

另请参阅:https://www.cs.cmu.edu/~dst/Adobe/Gallery/anon21jul01-pdf-encryption.txt –

回答

3

似乎预期PDF安全性是行不通的。

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

这实际上是PDF密码加密是如何工作的:

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

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

使用所有者密码而不是用户密码还允许您解密PDF(如上所述,它允许PDF处理器检索用户密码,然后继续并解密该文件)并另外告知PDF处理器您是该文件的所有者,因此不应受到该文件中未提供的任何许可限制。

PDF库通常根本不关心权限(AFAIK PDFBox没有),或者由于缺少拥有者密码(例如iText)而有开关覆盖限制。

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

+0

如果我使用doc.decrypt(“”);然后eventhough document.setAllSecurityToBeRemoved(false);对于用户,所有安全性都可以通过document.setAllSecurityToBeRemoved(true)来移除; PDFBOX不验证w.r.t.所有者密码。这似乎是PDFBOX中的一个错误。请澄清 – chiku

+1

正如我在答复中写道的:“PDF库通常不关心权限......”;你可以称之为*缺少的功能*。然而,我怀疑PDFBox用户对这个功能有很大的兴趣,所以它几乎没有任何优先权......并且考虑iText发生了什么事情:它有一种机制需要所有者密码进行某些操作,并且起初发生了什么?人们用它修补了这个机制,许多非官方的iText版本开始流行起来。然后IText引入了一个覆盖开关,用户只需要设置一个全局变量...... – mkl

+1

在开放源代码库中实现基于软许可的限制(如PDF中所示)基本上没有意义。 – mkl