我们网站的用户需要下载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"));
}
答案 0 :(得分:1)
我知道这可能有点虚假且冗长,但如果您在发送之前计算SHA哈希并将其存储在数据库中,您可以提供支持以验证PDF输出是否准确服务器生成一个。当然它很长,但可以用来防止欺诈。
答案 1 :(得分:1)
除了所有评论指出签署并宣布只有您签名的文件有效 的方式,并且不依赖于Adobe特定的硬件(存储哈希 - 或者复制 - 本地也无济于事,但是,你没有证明你本地存储的是你发给客户的东西),这里是你原来问题的答案:
使用iTextSharp的SetEncryption方法,PDF是否可以安全地防止用户修改?即使用户是程序员?它似乎是,但我想确定。
没有。任何可以在PDF阅读器中打开PDF的人(即PDF仅由所有者密码或所有者密码和已知的用户密码加密)都可以绕过加密。并且该行为后该人也可以重新加密。可能他会使用不同的所有者密码,但是如何证明您声称使用的所有者密码实际上是用于发送给用户的PDF?