我正在编写一个服务,我在其中使用空容器预先签署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)
之外,自定义容器不会执行任何操作。
签名本身有效,数字签名有效但我只需要更改可见签名本身的文本。我认为这是可能的,因为可见签名实际上与证书本身没有任何关系,只是方便显示证书中的名称,特别是有多个签名。
答案 0 :(得分:4)
当你写下来时你是对的:似乎我需要在实际签名之前添加可见签名。你写错了你错了:我认为这是可能的。
签名的外观由存储在PDF文档中的字典和流组成。这些对象是散列并随后签名的字节的一部分。在不破坏签名的情况下,您无法更改这些字节。