使用iTextSharp将多个数字签名插入PDF

时间:2016-04-20 17:31:25

标签: pdf itext digital-signature pkcs#11

我正在使用iTextSharp& pkcs11RsaSignature在PDF文档的每一页上插入数字签名。以下是我的代码:

        PdfReader pdfSource = new PdfReader(...);
        NumberOfPages = pdfSource.NumberOfPages;
        pdfSource.Close();
        CurrentPage = 1;

        while (CurrentPage <= NumberOfPages)
        {
            Temp3PDF = Temp1PDF;
            Temp1PDF = Temp2PDF;
            Temp2PDF = Temp3PDF;

            PdfReader pdfSrc = new PdfReader(Temp1PDF);
            FileStream pdfDes = new FileStream(Temp2PDF, FileMode.Create);
            PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfSrc, pdfDes, '\0', Path.GetTempFileName(), true);                
            PdfSignatureAppearance pdfSignAppearance = pdfStamper.SignatureAppearance;
            pdfSignAppearance.Acro6Layers = false;
            pdfSignAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), CurrentPage, null);
            MakeSignature.SignDetached(pdfSignAppearance, pkcs11RsaSignature, certPath, null, null, null, 0, CryptoStandard.CADES);
            pdfStamper.Close();
            pdfDes.Close();
            pdfSrc.Close();
            CurrentPage++;
        }

可以看出,这不是一种非常优雅的编程方式,因为文件的读取和写入次数与页数一样多。有没有其他方法在PDF文档的每一页上插入数字签名。

这里真正想做的是 - 如果将PDF文档拆分成页面(将来),由于内容没有改变,所以技术上数字签名对于签名的页面应该是有效的。但我意识到签名将失效。 (修改问题 - 有没有办法只对一页pdf而不是整个文档进行数字签名?)

致Bruno Lowagie(您是专家):除了PDF规范中未提供外,还可以通过签署仅在所选组件上计算的哈希来部分签署PDF文件。您是否认为可以升级PDF规范以满足此类要求。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

  

这里真正想做的是 - 如果将PDF文档拆分成页面(将来),由于内容没有改变,所以技术上数字签名对于签名的页面应该是有效的

这种思路是基于一种误解。是的,您可以在一个特定页面上显示签名的可视化,但是加密签名会签署整个PDF,但嵌入式CMS签名容器本身除外。

但你自己发现了这个。因此,让我们考虑一下你的改述问题:

  

但我意识到签名将失效。 (修改问题 - 有没有办法只对一页pdf而不是整个文档进行数字签名?

过去,可能允许签署单页的方式有两种:

  • 使用对象摘要专注于相关页面;
  • 使用字节范围摘要,仅包含覆盖与相关页面相关的对象的字节范围。

现在,这些技术不再是可用的选项了,因为

    很久以前,
  • 对象摘要已被弃用,ISO PDF规范甚至不再提及它们了;
  • 即使ISO 32000-1仍然允许字节范围摘要来覆盖PDF的这些片段集合,PDF处理器(特别是Adobe Reader)需要字节范围来覆盖整个PDF文件除嵌入式签名容器外;较新的规范(例如ETSI PAdES规范和ISO 32000-2草案)也要求这样做。

因此,不,没有办法只对一页pdf而不是整个文档进行数字签名,至少不是以可互操作的方式。

在多页PDF中实现与页面签名相似的选项将是

  • 将PDF拆分为多个PDF,每个PDF仅包含一个页面;
  • 签署这些单页PDF;和
  • 将所有这些单页PDF文件放入PDF便携式收藏集(又名作品集)中,并将其排列为按正确的顺序依次显示各个包含的PDF文件。