加密PDF的安全性如何? (没有SSL证书)

时间:2014-02-10 08:12:20

标签: c# pdf encryption itextsharp

我们网站的用户需要下载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"));
}

2 个答案:

答案 0 :(得分:1)

我知道这可能有点虚假且冗长,但如果您在发送之前计算SHA哈希并将其存储在数据库中,您可以提供支持以验证PDF输出是否准确服务器生成一个。当然它很长,但可以用来防止欺诈。

答案 1 :(得分:1)

除了所有评论指出签署并宣布只有您签名的文件有效 的方式,并且不依赖于Adobe特定的硬件(存储哈希 - 或者复制 - 本地也无济于事,但是,你没有证明你本地存储的是你发给客户的东西),这里是你原来问题的答案:

  

使用iTextSharp的SetEncryption方法,PDF是否可以安全地防止用户修改?即使用户是程序员?它似乎是,但我想确定。

没有。任何可以在PDF阅读器中打开PDF的人(即PDF仅由所有者密码或所有者密码和已知的用户密码加密)都可以绕过加密。并且该行为后该人也可以重新加密。可能他会使用不同的所有者密码,但是如何证明您声称使用的所有者密码实际上是用于发送给用户的PDF?