使用itext或itextsharp时,如何确定设置数字证书缓冲区长度的长度?
When using Itext or itextsharp, how do determine the length to set a digital cert buffer length?
我正在使用 itextsharp(但这个问题可能也适用于 itext)并且我正在向 PDF 添加数字签名。我已经阅读过,我知道数字签名的长度会根据 LTV 和其他许多因素而有所不同,因此当您将签名添加到文档时,您通常会分配一个过大的缓冲区来保存证书信息以确保它有足够的 space.
令我困惑的是,我在网上看到了这样设置 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 使用的大小不同?是草率的代码被复制了一地,还是有更深层次的原因?
Why do we create the initial dictionary entry with a buffer length * 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 因为 [=24] 的大小=] 签名容器 将收录文档 是
- 字节长度的两倍(由于十六进制编码)
- 加 2(用于括起 PDF 中的十六进制编码字符串的左尖括号和右尖括号)。
我正在使用 itextsharp(但这个问题可能也适用于 itext)并且我正在向 PDF 添加数字签名。我已经阅读过,我知道数字签名的长度会根据 LTV 和其他许多因素而有所不同,因此当您将签名添加到文档时,您通常会分配一个过大的缓冲区来保存证书信息以确保它有足够的 space.
令我困惑的是,我在网上看到了这样设置 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 使用的大小不同?是草率的代码被复制了一地,还是有更深层次的原因?
Why do we create the initial dictionary entry with a buffer length * 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 因为 [=24] 的大小=] 签名容器 将收录文档 是
- 字节长度的两倍(由于十六进制编码)
- 加 2(用于括起 PDF 中的十六进制编码字符串的左尖括号和右尖括号)。