0

我看过签署https://www.pdftron.com/documentation/nodejs/guides/features/signature/sign-pdf的例子

signOnNextSave 使用 PKCS #12 证书,但我使用 Google KMS 进行非对称签名以确保私钥安全。

这是通过 Google Cloud KMS 进行签名和验证的示例

我尝试实现自定义 SignatureHandler 但 Node.JS API 不同于 Java 或 .NET https://www.pdftron.com/api/pdfnet-node/PDFNet.SignatureHandler.html

如何实现自定义签名和验证逻辑?

const data = Buffer.from('pdf data')

// We have 2048 Bit RSA - PSS Padding - SHA256 Digest key in Google Cloud KMS
const signAsymmetric = async () => {
  const hash = crypto.createHash('sha256')
  hash.update(data)
  const digest = hash.digest()
  const digestCrc32c = crc32c.calculate(digest)

  // Sign the data with Cloud KMS
  const [signResponse] = await client.asymmetricSign({
    name: locationName,
    digest: {
      sha256: digest
    },
    digestCrc32c: {
      value: digestCrc32c
    }
  })

  if (signResponse.name !== locationName) {
    throw new Error('AsymmetricSign: request corrupted in-transit')
  }
  if (!signResponse.verifiedDigestCrc32c) {
    throw new Error('AsymmetricSign: request corrupted in-transit')
  }
  if (
    crc32c.calculate(signResponse.signature) !==
    Number(signResponse.signatureCrc32c.value)
  ) {
    throw new Error('AsymmetricSign: response corrupted in-transit')
  }

  // Returns signature which is buffer
  const encoded = signResponse.signature.toString('base64')
  console.log(`Signature: ${encoded}`)

  return signResponse.signature
}

// Verify data with public key
const verifyAsymmetricSignatureRsa = async () => {
  const signatureBuffer = await signAsymmetric()
  const publicKeyPem = await getPublicKey()

  const verify = crypto.createVerify('sha256')
  verify.update(data)
  verify.end()

  const key = {
    key: publicKeyPem,
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING
  }

  // Verify the signature using the public key
  const verified = verify.verify(key, signatureBuffer)
  return verified
}
4

1 回答 1

2

目前,PDFTron SDK 仅支持 C++、Java 和 C# 上的自定义处理程序(未来有更多计划包括其他语言)。

在像 C++ 这样的不同平台上,您可以通过放入 来扩展自定义处理程序函数hash.update(data)SignatureHandler::AppendData而其余的 signAsymmetric 将放入SignatureHandler::CreateSignature. 将为自定义处理程序指定一个名称以实现互操作性,例如Adobe.PPKLite(我们还不支持自定义处理程序 SubFilter 条目,仅支持 Filter ——请参阅 PDF 标准了解差异——但这并不重要,只要您使用验证工具支持过滤器Adobe.PPKLite)。具体示例请参见以下链接: https ://www.pdftron.com/documentation/samples/cpp/DigitalSignaturesTest

至于验证,如果您的签名满足以下条件,我们的代码已经可以为您执行此操作:

  1. 他们使用标准的摘要算法
  2. 他们使用 RSA 签名
  3. 他们根据 PDF 标准使用正确的数据格式(即分离的 CMS、数字签名字典)

如果您有更多问题或需要更多详细信息,请随时通过 support@pdftron.com 联系 PDFTron 支持

于 2021-02-23T22:25:45.220 回答