我正在寻找一种即时密码保护 PDF 文件的方法,而无需以明文形式存储用户密码。
我想做的是根据 PDF 规范生成用户和所有者密钥,并使用它们来加密文档的字符串和流。是否有支持此功能的库?
- 编辑 -
澄清一下,我想要做的是允许用户将他们的密码输入系统一次,然后在之后的任何时间都能够使用从该密码生成的密钥加密 PDF 文件。大多数 PDF 库要求密码以明文形式传递,我想要的是一个采用“公钥”密钥的加密函数。
我正在寻找一种即时密码保护 PDF 文件的方法,而无需以明文形式存储用户密码。
我想做的是根据 PDF 规范生成用户和所有者密钥,并使用它们来加密文档的字符串和流。是否有支持此功能的库?
- 编辑 -
澄清一下,我想要做的是允许用户将他们的密码输入系统一次,然后在之后的任何时间都能够使用从该密码生成的密钥加密 PDF 文件。大多数 PDF 库要求密码以明文形式传递,我想要的是一个采用“公钥”密钥的加密函数。
http://itextpdf.com/具有包括加密在内的开源 Java 和 C# PDF 库。
我想我已经在 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一起去。
几乎每个 PDF 库都支持 PDF 加密。
每个库以完全相同的方式将用户和所有者密码存储在加密的 PDF 中。这是必需的,因为它是由规范定义的。
因此,就库而言,您将发现的差异将与支持的加密方案有关,而不是与密码的实际存储有关。
大多数将支持旧的基本形式。很少有人支持 AES 256 位加密。这取决于什么对你来说很重要。
我在 ABCpdf .NET 软件组件上工作,因此我的回复可能包含基于 ABCpdf 的概念。这只是我所知道的。:-)”