2013-05-14 143 views
2

我正在尋找一種密碼保護PDF文件的方式,無需以明文形式存儲用戶密碼。在不影響密碼的情況下即時密碼保護PDF文檔

我想要做的是根據PDF規範生成用戶和所有者密鑰,並使用它們來加密文檔的字符串和流。有支持這種功能的庫嗎?

- 編輯 -

只是爲了澄清,我想要做的就是讓用戶輸入自己的密碼進入系統一次,然後任何時間後,爲了能夠到PDF文件與加密從該密碼生成的密鑰。大多數PDF庫要求密碼以明文形式傳遞,我想要的是一個採用「公共」密鑰的加密函數。

+0

什麼使你*不得不以明文存儲用戶的密碼?* – mkl 2013-05-14 05:09:48

+0

@mkl我使用的命令行工具(qpdf)只提供明文密碼的選項。 – 2013-05-14 06:10:02

+0

在加密過程中的某個步驟中,即使只在內存中,密碼仍以純文本形式存在。如果沒關係,任何像樣的通用PDF庫都可以。在運行時環境或lib的許可細節方面是否有任何限制? – mkl 2013-05-14 07:33:33

回答

0

http://itextpdf.com/擁有包含加密功能的開源Java和C#PDF庫。

+0

謝謝。我看了一下Java源代碼。它可能會被修改爲做我想要的。 – 2013-05-14 06:09:32

0

幾乎每個PDF庫都支持PDF加密。

用戶和所有者密碼以完全相同的方式存儲在加密的PDF中。這是必要條件,因爲它是由規範定義的。

因此,就圖書館而言,你將發現的差異將與支持的加密方案有關,而不是密碼的實際存儲。

大部分將支持舊的基本形式。很少支持AES 256位加密。這隻取決於對你重要的事情。

我在ABCpdf .NET軟件組件上工作,所以我的回覆可能包含基於ABCpdf的概念。這正是我所知道的。 :-)」

+0

我不會說實際上每個PDF庫都支持它。例如,我驚訝地發現Perl中的兩個主要PDF庫(CAM :: PDF和PDF :: API2)不支持OP所要做的事情,即加密由另一個程序創建的未加密的PDF 。如果你看一下PDF規範,它的明顯原因,絕對不是微不足道的添加到圖書館。 – qwwqwwq 2013-05-14 14:22:00

0

我想我已經找到了qpdf源的答案

libqpdf/qpdfencryption.cc線999:

if (V < 5) 
{ 
    // For V < 5, the user password is encrypted with the owner 
    // password, and the user password is always used for 
    // computing the encryption key. 
    this->encryption_key = compute_encryption_key(
     this->user_password, data); 
} 
else 
{ 
    // For V >= 5, either password can be used independently to 
    // compute the encryption key, and neither password can be 
    // used to recover the other. 
    bool perms_valid; 
    this->encryption_key = recover_encryption_key_with_password(
     this->provided_password, data, perms_valid); 
    if (! perms_valid) 
    { 
     warn(QPDFExc(qpdf_e_damaged_pdf, this->file->getName(), 
        "encryption dictionary", this->file->getLastOffset(), 
        "/Perms field in encryption dictionary" 
        " doesn't match expected value")); 
    } 
} 

無論哪種方式,需要密碼來計算。加密密鑰我懷疑是計算加密密鑰都可能會受到逆向工程來恢復密碼,讓存儲,這也是一個不錯的主意

我能想到的方案是:

  1. 要求用戶每次下載文件時都要重新輸入密碼。
  2. 爲每個用戶提供安全性較低的二級密碼 - 僅用於加密PDF文件。確保它與用戶的主密碼不同。

我開始認爲使用用戶的主密碼保護PDF文件可能會造成安全漏洞。我要#2。