我们网站的用户需要下载一份PDF文件,作为交易已执行的证据。
出于安全目的,我需要确保用户不能编辑PDF(即编辑PDF,更改一些值,并将其发回,说明我们的系统出错)。
我知道签署PDF是一个不错的选择,但我更愿意避免这样做,因为我们需要Adobe的动态签名证书设备,我被告知这相当昂贵。
所以我的问题是:使用iTextSharp的SetEncryption方法,PDF对用户修改是否安全?即使用户是程序员?看起来是这样,但我想确定一下。
我的加密代码(粘贴自StackOverflow上的另一篇帖子:):
Console.WriteLine("Creating...");
var file = File.CreateText(fileName);
using (Document document = new Document())
{
PdfWriter writer = PdfWriter.GetInstance(
document, file.BaseStream);
writer.SetEncryption(
null, //No user password
System.Text.Encoding.UTF8.GetBytes("ownerPassword"),
PdfWriter.ALLOW_PRINTING
| PdfWriter.ALLOW_COPY
,
PdfWriter.ENCRYPTION_AES_128
);
document.Open();
document.Add(new Paragraph("hello world"));
}
除了所有评论都指出,签署并宣布只有您签署的文档才有效是的方式,而且不依赖于Adobe特定的硬件(不过,在本地存储哈希或副本没有帮助,您无法证明您在本地存储的内容就是您发送给客户的内容),这是你最初问题的答案:
使用iTextSharp的SetEncryption方法,PDF对用户修改是否安全?即使用户是程序员?看起来是这样,但我想确定一下。
否。任何可以在PDF阅读器中打开PDF的人(即,PDF仅通过所有者密码或所有者密码和已知用户密码加密)都可以绕过加密。并且在该行为之后,该人也可以重新加密。他可能会使用不同的所有者密码,但你如何证明你声称使用的所有者密码实际上是在发送给用户的PDF中使用的?
我知道这可能有点虚假和冗长,但如果你在发送之前计算SHA哈希,并将其存储在数据库中,你可以提供一种方法来验证PDF输出是否与服务器生成的完全相同。当然,这是长篇大论,但可以用来防御欺诈。