2016-09-22 22 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及其中引用的文檔。