我正在尋找一種密碼保護PDF文件的方式,無需以明文形式存儲用戶密碼。在不影響密碼的情況下即時密碼保護PDF文檔
我想要做的是根據PDF規範生成用戶和所有者密鑰,並使用它們來加密文檔的字符串和流。有支持這種功能的庫嗎?
- 編輯 -
只是爲了澄清,我想要做的就是讓用戶輸入自己的密碼進入系統一次,然後任何時間後,爲了能夠到PDF文件與加密從該密碼生成的密鑰。大多數PDF庫要求密碼以明文形式傳遞,我想要的是一個採用「公共」密鑰的加密函數。
我正在尋找一種密碼保護PDF文件的方式,無需以明文形式存儲用戶密碼。在不影響密碼的情況下即時密碼保護PDF文檔
我想要做的是根據PDF規範生成用戶和所有者密鑰,並使用它們來加密文檔的字符串和流。有支持這種功能的庫嗎?
- 編輯 -
只是爲了澄清,我想要做的就是讓用戶輸入自己的密碼進入系統一次,然後任何時間後,爲了能夠到PDF文件與加密從該密碼生成的密鑰。大多數PDF庫要求密碼以明文形式傳遞,我想要的是一個採用「公共」密鑰的加密函數。
幾乎每個PDF庫都支持PDF加密。
用戶和所有者密碼以完全相同的方式存儲在加密的PDF中。這是必要條件,因爲它是由規範定義的。
因此,就圖書館而言,你將發現的差異將與支持的加密方案有關,而不是密碼的實際存儲。
大部分將支持舊的基本形式。很少支持AES 256位加密。這隻取決於對你重要的事情。
我在ABCpdf .NET軟件組件上工作,所以我的回覆可能包含基於ABCpdf的概念。這正是我所知道的。 :-)」
我不會說實際上每個PDF庫都支持它。例如,我驚訝地發現Perl中的兩個主要PDF庫(CAM :: PDF和PDF :: API2)不支持OP所要做的事情,即加密由另一個程序創建的未加密的PDF 。如果你看一下PDF規範,它的明顯原因,絕對不是微不足道的添加到圖書館。 – qwwqwwq 2013-05-14 14:22:00
我想我已經找到了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"));
}
}
無論哪種方式,需要密碼來計算。加密密鑰我懷疑是計算加密密鑰都可能會受到逆向工程來恢復密碼,讓存儲,這也是一個不錯的主意
我能想到的方案是:
我開始認爲使用用戶的主密碼保護PDF文件可能會造成安全漏洞。我要#2。
什麼使你*不得不以明文存儲用戶的密碼?* – mkl 2013-05-14 05:09:48
@mkl我使用的命令行工具(qpdf)只提供明文密碼的選項。 – 2013-05-14 06:10:02
在加密過程中的某個步驟中,即使只在內存中,密碼仍以純文本形式存在。如果沒關係,任何像樣的通用PDF庫都可以。在運行時環境或lib的許可細節方面是否有任何限制? – mkl 2013-05-14 07:33:33