在没有私钥的情况下签署pdf

时间:2016-06-10 17:48:02

标签: java pdf itext digital-signature

我们被问到了一些我认为不可能的事情。

webservice返回base64字符串签名(不是证书或私钥)。

我们被要求签署带有该签名的pdf。

是否可以用这个签署PDF?我们不太了解数字签名的理论,每次我们需要做这样的事情我们有私钥和证书有效,所以我们不知道这是否可行(并且不知道是否有道理)。

这是我们的代码,我们不知道String签名如何适合这里。

    public void sign(ByteArrayInputStream document, OutputStream os, String digestAlgorithm, String provider, CryptoStandard subfilter, String reason, String location) throws GeneralSecurityException, IOException, DocumentException {

        PdfReader reader = new PdfReader(document);
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
        PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
        appearance.setReason(reason);
        appearance.setLocation(location);
        appearance.setSignatureCreator(provider);
        appearance.setVisibleSignature(new Rectangle(0, 0, 100, 780), 1, "sig");
        ExternalDigest digest = new BouncyCastleDigest();
        List<Certificate> listCert = new ArrayList<Certificate>();
        listCert.add(this.getCertificate());
        Certificate[] chain = new Certificate[listCert.size()];
        chain = listCert.toArray(chain);
        ExternalSignatureContainer cont = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
        cont.sign(document);
        MakeSignature.signExternalContainer(appearance, cont, 50);
    }

我更新答案以回应Xavier。

我们没有被要求进行任何验证,我知道这是数字签名的最佳和主要思想,我们已经提出了有效的证书,但没有回复。

所以,除此之外,它是否有意义,有可能吗?

1 个答案:

答案 0 :(得分:1)

不,这通常是不可能的。

内容签名应指明特定的签名者,并且应该超过特定内容。如果您可以重新分配签名,则攻击者可以执行相同操作并声明已签署不同的文档。

所以有两种可能性:

  1. XML包含要签名并放在PDF文档中的内容(似乎不太可能);
  2. 签名只是为了保护传输中的XML信息。
  3. 后者似乎最有可能。例如,Web服务安全性(WS-Security)可以使用基于XML的签名。