gpt4 book ai didi

java - pdfbox - 文档自签名后已被更改或损坏

转载 作者:搜寻专家 更新时间:2023-11-01 03:01:07 25 4
gpt4 key购买 nike

我正在使用 pdfbox-1.8.8 对 PDF 文件执行签名功能。

当我签署文件时,我得到了

enter image description here

这是我的代码:

public void signDetached(String inputFilePath, String outputFilePath, String signatureImagePath, Sign signProperties) {
OutputStream outputStream = null;
InputStream inputStream = null;
PDDocument document = null;
InputStream signImageStream = null;

try {
setTsaClient(null);
document = PDDocument.load(inputFilePath);
// create signature dictionary
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("VANDUC1102");
signature.setLocation(null);
String displayName = "Hello World, Document signed by VANDUC1102";
String reason = reasonText+ " " + displayName;
signature.setReason(reason);

// the signing date, needed for valid signature
signature.setSignDate(Calendar.getInstance());
int signatureInPage = signProperties.getPageNumber() + 1;
signImageStream = new FileInputStream(new File(signatureImagePath));
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(inputFilePath, signImageStream, signatureInPage);

float xAxis = convertPixel2Point(signProperties.getX()) ;
float yAxis = convertPixel2Point(signProperties.getY());
float signImageHeight = convertPixel2Point(signImageHeight);
float signImageWidth = convertPixel2Point(signImageWidth);

visibleSig.xAxis(xAxis)
.yAxis(yAxis)
.zoom(0)
.signatureFieldName("Signature")
.height(signImageHeight)
.width(signImageWidth);
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();

signatureProperties.signerName(eiUser.getName())
.signerLocation(null)
.signatureReason(reason)
.preferredSize(0)
.page(signProperties.getPageNumber())
.visualSignEnabled(true)
.setPdVisibleSignature(visibleSig)
.buildSignature();
// register signature dictionary and sign interface
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(signatureProperties);
signatureOptions.setPage(signatureInPage);
document.addSignature(signature, this, signatureOptions);

File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
document.saveIncremental(inputStream, outputStream);
outputStream.flush();
} catch (COSVisitorException | SignatureException | IOException ex) {
log.error("signDetached ", ex);
} finally {
IOUtils.closeStream(outputStream);
IOUtils.closeStream(inputStream);
IOUtils.closeStream(signImageStream);
IOUtils.closeStream(document);
}
}
private float convertPixel2Point(float pixel){
return pixel * (float) 72/96;
}

所以,我这个问题是因为我使用了自签名证书或者我的代码有问题。

这里是sample file的链接.

谢谢

最佳答案

对损坏的签名 PDF 的分析

我刚刚看过您的样本 PDF。从结构上看没问题,只是签名中给出的数据哈希值

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

与带符号字节范围的实际哈希值不匹配

4f48eab20d340957bd5693104af097ed7363bd84181a6a1c834c138c1376cbe3

因此,要么文档确实在事后被操纵,要么在签名过程中的哈希计算已经做错了。

由于您的示例代码不是独立的 - 它似乎依赖于成为提供额外方法和实现某些接口(interface)的类的一部分 - 我无法检查它是哪一个。

原因

在 OP 在评论中指出他构建代码的示例是 CreateVisibleSignature.java 之后,我可以重现问题(参见 SignLikeVanduc1102 测试方法 testCorruptOriginal),并将他的代码与原始代码进行比较,原因很快就显而易见了:他使用了错误的 InputStream他的 PDDocument.saveIncremental(InputStream, OutputStream) 调用的参数:

File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
document.saveIncremental(inputStream, outputStream);

输入流

  • 已在前面的 IOUtils.copyStream 调用和
  • 毕竟是错误的:它只引用原始 PDF,但 saveIncremental 需要一个 InputStream 引用包含原始 PDF 和新 PDF 的 PDF , 签名携带修改.

因此,可以这样解决:

File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
IOUtils.closeStream(inputStream);
inputStream = new FileInputStream(outputFile);
document.saveIncremental(inputStream, outputStream);

(另见 SignLikeVanduc1102 测试方法 testCorruptFixed。)

这对应于原始的 PDFBox 示例代码:

File outputDocument = new File(document.getParent(), substring + "_signed.pdf");
FileInputStream fis = new FileInputStream(document);
FileOutputStream fos = new FileOutputStream(outputDocument);

int c;
while ((c = fis.read(buffer)) != -1) {
fos.write(buffer, 0, c);
}
fis.close();
fis = new FileInputStream(outputDocument);

OP 声明使用 PDFBox 2.0 他的代码有效。这很可能是由于增量保存调用已更改,它不再具有 inputStream 参数。

关于java - pdfbox - 文档自签名后已被更改或损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com