密码可以在不影响密码的情况下即时保护PDF文档

时间:2013-05-14 03:03:57

标签: pdf encryption

我正在寻找一种密码保护PDF文件的方法,而无需以明文形式存储用户密码。

我想要做的是根据PDF规范生成用户密钥和所有者密钥,并使用它们来加密文档的字符串和流。是否有支持此功能的库?

- 编辑 -

只是为了澄清,我想要做的是允许用户将密码输入系统一次,然后在此之后的任何时间使用密码生成的密钥加密PDF文件。大多数PDF库要求密码以明文形式传递,我想要的是一个带有“公共”密钥的加密函数。

3 个答案:

答案 0 :(得分:0)

http://itextpdf.com/包含开源Java和C#PDF库,包括加密。

答案 1 :(得分:0)

几乎每个PDF库都支持PDF加密。

用户和所有者密码以完全相同的方式存储在加密的PDF中。这是必需的,因为它是由规范定义的。

因此,就库而言,您将要找到的差异将与所支持的加密方案相关,而不是密码的实际存储。

大多数人会支持旧的基本形式。很少支持AES 256位加密。这取决于对你来说重要的事情。

我在ABCpdf .NET软件组件上工作,所以我的回复可能包含基于ABCpdf的概念。这就是我所知道的。 :-)“

答案 2 :(得分: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文件。确保它与用户的主密码不同。
  3. 我开始认为使用用户的主密码保护PDF文件可能会产生安全漏洞。我要去#2。