是否存在方法:输入无签名PDF,输出对应签名提取后的目标PDF?
问题描述
我目前有三个PDF文件:
- 无任何签名的纯PDF
- 使用Adobe Acrobat DC对第一个PDF进行数字签名后的文件
- 通过以下iText代码处理第二个PDF,提取其签名相关字节并转为Base64编码后生成的PDF
处理签名PDF的代码如下:
com.itextpdf.kernel.pdf.PdfReader pdfReader = new com.itextpdf.kernel.pdf.PdfReader(new FileInputStream("C:\\Users\\Dell\\Desktop\\test2.pdf")); com.itextpdf.kernel.pdf.PdfDocument pdfDocument = new com.itextpdf.kernel.pdf.PdfDocument(pdfReader); SignatureUtil signatureUtil = new SignatureUtil((pdfDocument)); for(String name: signatureUtil.getSignatureNames()){ System.out.println(name); PdfSignature signature = signatureUtil.getSignature(name); PdfArray b = signature.getByteRange(); long[] longs = b.asLongArray(); RandomAccessFileOrArray rf = pdfReader.getSafeFile(); try (InputStream rg = new RASInputStream(new RandomAccessSourceFactory().createRanged(rf.createSourceView(),longs)); ByteArrayOutputStream byteArrayOutputStream = new com.itextpdf.io.source.ByteArrayOutputStream();) { byte[] buf = new byte[8192]; int rd; while ((rd = rg.read(buf, 0, buf.length)) > 0) { byteArrayOutputStream.write(buf, 0, rd); } byte[] bytes1 = byteArrayOutputStream.toByteArray(); String s2 = DatatypeConverter.printBase64Binary(bytes1); } }
我的问题是:是否存在一种方法,以第一个无签名PDF为输入参数,输出第三个PDF文件?
回答
不行,核心原因如下:
- 第三个PDF的核心内容是第二个签名PDF中数字签名字节范围数据的Base64编码,这部分数据包含两个关键信息:原PDF内容的哈希值,以及你用签名私钥对该哈希值生成的签名结果。
- 数字签名的签名结果必须由签名时使用的私钥生成,仅靠无签名的第一个PDF,没有对应的私钥就无法生成合法的签名数据。
- 即使你能复刻Adobe Acrobat DC的签名文件格式,缺少私钥也无法生成匹配的字节范围数据,自然无法得到对应Base64编码内容,也就无法输出第三个PDF。
如果需要得到类似第三个PDF的文件,必须先使用相同的私钥对第一个PDF进行数字签名生成第二个PDF,再通过代码提取签名字节并转为Base64后生成目标文件。
内容的提问来源于stack exchange,提问作者fuyun shenma
相关产品推荐
相关产品推荐

