Gig*_*igi 4 c# pdf itextsharp digital-signature
我有一个签名的 PDF 文件。使用这个使用 iTextSharp 库的函数,我找到了证书 p7m 签名:
private void GetSignature(string FileName)
{
AcroFields acroFields = new PdfReader(FileName).AcroFields;
List<string> names = acroFields.GetSignatureNames();
foreach (var name in names)
{
PdfDictionary dict = acroFields.GetSignatureDictionary(name);
PdfString contents = (PdfString)PdfReader.GetPdfObject(dict.Get(PdfName.CONTENTS));
byte[] PKCS7 = contents.GetOriginalBytes();
ByteArrayToFile(@"c:\signature\" + name + ".p7m", PKCS7);
}
}
Run Code Online (Sandbox Code Playgroud)
现在...如何提取与签名关联的图像(位图)?是否可以?谢谢,路易吉
在您的示例文档中,术语签名适用于三个方面:
根据创建这些多级签名的软件制造商的说法,手写签名似乎是身份的主要证明。数字版仅用于保护文档免受更改;它不一定反映手动签名的人的身份,而是反映创建该手动签名的设备的所有者(“请在此处签名表示您收到了包裹”):
职能
手写签名捕获- 签名板、支付终端、iPad 或 Android 设备上的法医可识别签名。
签名验证- 将手写签名与预先注册的个人资料进行比较。
控制签名过程中的所有步骤- 包括定位签名字段、填写表格、添加注释、添加附件等等。
保护文件的完整性- 通过用数字签名密封它们。
关于使用 iText 提取所有这些信息...
AcroFields。因此,最相关的信息是最不容易获得的信息。
PS关于加密生物识别有效载荷的解密,我在制造商的网站上找到了以下内容:
该文档包含已加密的捕获签名(RSA 4096 + AES256)。一个人的签名在被签名板捕获时会立即被加密,使用特殊证书的私钥。该特殊证书由公司使用 xyzmo 套件选择,通常存储在公司外部的安全环境中(银行保险箱、外部公证人等)。因此,xyzmo 本身无法访问此证书。对于签名的加密,xyzmo 套件只需要证书的公钥。仅在解密和从文档中提取签名时,才需要私钥。只有公司授予其访问此证书的特定人员才能使用作为套件的一部分提供的 PenAnalyst 工具解密配置文件。
因此,要解密生物识别数据,您必须访问相应的私钥,该私钥通常存储在公司外部的安全环境中(银行保险箱、外部公证人等)。如果您有这种访问权限,我们可能会继续讨论那些解密数据的格式......;)
顺便说一句,如果任何人都可以简单地从签名文档中检索生物特征数据,那么他们很容易被复制到其他文档以伪造签名。
提取手写签名的位图图像
由于对提取手写签名的位图图像特别感兴趣,这里有一个快速而肮脏的助手来提取签名的图像。正如已经说过的,我用 Java 做这件事,因为我在那里更自在:
public class XyzmoSignatureDataExtractor
{
public XyzmoSignatureDataExtractor(PdfReader reader)
{
this.reader = reader;
}
public PdfImageObject extractImage(String signatureName) throws IOException
{
MyImageRenderListener listener = new MyImageRenderListener();
PdfDictionary sigFieldDic = reader.getAcroFields().getFieldItem(signatureName).getMerged(0);
PdfDictionary appearancesDic = sigFieldDic.getAsDict(PdfName.AP);
PdfStream normalAppearance = appearancesDic.getAsStream(PdfName.N);
PdfDictionary resourcesDic = normalAppearance.getAsDict(PdfName.RESOURCES);
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
processor.processContent(ContentByteUtils.getContentBytesFromContentObject(normalAppearance), resourcesDic);
return listener.image;
}
class MyImageRenderListener implements RenderListener
{
public void beginTextBlock() { }
public void endTextBlock() { }
public void renderImage(ImageRenderInfo renderInfo)
{
try
{
image = renderInfo.getImage();
}
catch (IOException e)
{
throw new RuntimeException("Failure retrieving image", e);
}
}
public void renderText(TextRenderInfo renderInfo) { }
PdfImageObject image = null;
}
final PdfReader reader;
}
Run Code Online (Sandbox Code Playgroud)
你像这样使用它:
PdfReader reader = new PdfReader(resourceStream);
XyzmoSignatureDataExtractor extractor = new XyzmoSignatureDataExtractor(reader);
AcroFields acroFields = reader.getAcroFields();
for (String name: acroFields.getSignatureNames())
{
System.out.printf("\nTesting signature '%s'.\n", name);
PdfImageObject image = extractor.extractImage(name);
OutputStream os = new FileOutputStream("target/test-outputs/SampleXyzmoSignature-image-" + name + "." + image.getFileType());
os.write(image.getImageAsBytes());
os.close();
PdfDictionary imageDictionary = image.getDictionary();
PRStream maskStream = (PRStream) imageDictionary.getAsStream(PdfName.SMASK);
if (maskStream != null)
{
PdfImageObject maskImage = new PdfImageObject(maskStream);
os = new FileOutputStream("target/test-outputs/SampleXyzmoSignature-image-" + name + "-mask." + maskImage.getFileType());
os.write(maskImage.getImageAsBytes());
os.close();
}
}
Run Code Online (Sandbox Code Playgroud)
警告:这门课XyzmoSignatureDataExtractor真的是一个快速而肮脏的黑客。做了许多假设,null省略了检查,......
| 归档时间: |
|
| 查看次数: |
7577 次 |
| 最近记录: |