2016-09-22 24 views
1

我正在开发一个生成试用问题的网络应用程序。所以安全在这个项目中非常重要。当试题的提交完成后,应用程序会创建一个pdf文档。我写一个加密的字符串在文档页脚:如何让PDF文件独一无二?

public function Footer() 
{ 

    if ($this->logo != null) { 

     $this->Image($this->logo, 20, 278, 10, 10, 'PNG', '', 'C', false, 200, '', false, false, 0, false, false, false); 

    } 


    $this->SetY(-20); 


    $this->SetFont('helvetica', 'I', 8); 


    $this->Cell(0, 20, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M'); 

    $this->Cell(0, 20, date("d/m/Y"), 0, 0, 'R', 0, '', 0, false, 'T', 'M'); 

    if ($this->text_crypter != null) { // this is the encrypted string 


     $this->SetY(-7); 

     $this->SetFont('helvetica', '', 6); 
     $this->MultiCell(0, 7, $this->text_crypter, false, 'L', false, 0, '', '', true); 

    } 

} 

正如你可以看到加密的字符串在每个页面的页脚写入。

enter image description here

但这是不够的,唯一标识,该文件是从我的应用程序内置因为有可能是谁可以复制加密字符串并将其粘贴到另一个文档的恶意人士

那么有什么办法让PDF文档被证明来自我的应用程序?

+6

使用仅适用于您的应用的私钥对数字签名进行签名。 – mkl

+0

用只有你知道的masterpw锁定pdf。然后有人可以将ID字符串复制出来,但是由于pdf与您的主密码锁定在一起,因此没有办法(如果您保持密码/安全)来复制该字符串。 –

+0

@pheromix“如何做到这一点” - 我不熟悉PHP PDF签名库,我会知道Java或.Net上下文中的选项。 – mkl

回答

2

(从评论的问题收集...)

唯一地标识文档是从你的应用程序,建你应该让你的应用程序与使用数字签名来签署文件私钥只对您的应用程序可用。

ÁlvaroGonzález指出Example 052 : digital signature certification作为如何使用TCPDF应用数字签名的示例。

Ryan Vincent解释说签名包含PDF文档的散列以及其他细节。当它被选中时 - 文件散列也被检查。无法将签名转移到其他文档。检查肯定会失败。

您可以在Adobe Reader中查看集成的PDF签名。验证您的证书是否是签名验证对话框中的签名者证书。

Ryan Vincent指出digital signatureCryptography Digital signatures教程中有关数字签名如何工作的信息。

有关集成PDF签名的详细信息,请参阅信息安全堆栈交换中的this answer及其中引用的文档。