我正在使用itextsharp(但这个问题可能也适用于itext),我正在为PDF添加数字签名。我已经完成了阅读,并且我理解数字签名的长度会因LTV和其他因素的漏洞而异,所以当您将签名添加到文档时,通常会分配一个过大的缓冲区来保存证书信息确保它有足够的空间。
让我感到困惑的是,我在整个网络上看到一个例子,其中设置了一个sig压模:
Dictionary<PdfName, int> exc = new Dictionary<PdfName, int>();
exc.Add(PdfName.CONTENTS, BUFFER_SIZE * 2 + 2);
sap.PreClose(exc);
然后稍后归零
byte[] signature_buffer = new byte[BUFFER_SIZE];
int index = 0;
while (index < signature_buffer.Length)
signature_buffer[index++] = 0x20;
PdfDictionary dic2 = new PdfDictionary();
dic2.Put(PdfName.CONTENTS, new PdfString(signature_buffer).SetHexWriting(true));
为什么我们创建缓冲区长度为* 2 + 2的初始字典条目?为什么它与PdfDictionary使用的大小不同?是不是在整个地方复制了草率代码的情况,还是有更深层次的原因?
答案 0 :(得分:2)
为什么我们创建一个缓冲区长度为* 2 + 2的初始字典条目?
这在iText中PdfSignatureAppearance.preClose
的方法评论中有解释(在iTextSharp中可能相同):
/**
* This is the first method to be called when using external signatures. The general sequence is:
* preClose(), getDocumentBytes() and close().
* <p>
* If calling preClose() <B>dont't</B> call PdfStamper.close().
* <p>
* <CODE>exclusionSizes</CODE> must contain at least
* the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the
* document. Note that due to the hex string coding this size should be
* byte_size*2+2.
* @param exclusionSizes a <CODE>HashMap</CODE> with names and sizes to be excluded in the signature
* calculation. The key is a <CODE>PdfName</CODE> and the value an
* <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present
* @throws IOException on error
* @throws DocumentException on error
*/
public void preClose(HashMap<PdfName, Integer> exclusionSizes) throws IOException, DocumentException
如此处所解释的,由于此大小的十六进制字符串编码应为byte_size * 2 + 2 ,因为 签名容器将占用的大小文件是