使用iTextSharp签署pdf文件后更改签名外观

时间:2014-01-28 15:55:26

标签: c# pdf itextsharp itext digital-signature

我正在编写一个服务,我在其中使用空容器预先签署pdf文件,从pdf文件中获取一个字节范围的散列并将其发送到另一个服务,这将允许用户使用一部手机。我收到了一份证书,我将在预签名的pdf文件中注入签名容器。

到目前为止,一切都有效,除了我想在文档中有可见的签名。可见签名需要证书从中获取信息(比如谁签名以及何时签名),但似乎我需要在实际签名之前添加可见签名。

因此,我的问题是,是否可以在签名后更改文档中签名的外观?可见签名图像似乎在文档的带符号字节范围之外。

我使用空白容器预签名文件:

IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE,                                                                                 PdfName.ETSI_CADES_DETACHED);
MakeSignature.SignExternalContainer(_sap, external, 8192 * 2);  

_sap来自压模的SignatureAppearance以下列方式初始化:

PdfStamper stamper = PdfStamper.CreateSignature(reader, baos, '\0', null, true);

从SignatureAppearance:

返回字节范围的哈希值
Stream data = _sap.GetRangeStream();
_hash = DigestAlgorithms.Digest(data, DigestAlgorithms.SHA1);
_hashStr = Convert.ToBase64String(_hash);
return _hashStr;

然后当我获得认证时,我创建了一个自定义容器:

IExternalSignatureContainer container = new CustomContainer(cert);
MakeSignature.SignDeferred(reader, _signatureFieldName, baos, container); 

除了在cert方法中返回public byte[] Sign(Stream data)之外,自定义容器不会执行任何操作。

签名本身有效,数字签名有效但我只需要更改可见签名本身的文本。我认为这是可能的,因为可见签名实际上与证书本身没有任何关系,只是方便显示证书中的名称,特别是有多个签名。

1 个答案:

答案 0 :(得分:4)

当你写下来时你是对的:似乎我需要在实际签名之前添加可见签名。你写错了你错了:我认为这是可能的。

签名的外观由存储在PDF文档中的字典和流组成。这些对象是散列并随后签名的字节的一部分。在不破坏签名的情况下,您无法更改这些字节。