如何使用 Python 在 pdf 中进行数字签名

ele*_*ded 2 python pdf signing digital ecdsa

我想用 Python 中的p12证书对 PDF 进行签名,但我不知道如何开始、使用哪些库或如何操作。

\n

我很了解数字签名的工作原理,但我想用 Python 来实现。如果有任何帮助,我将不胜感激。

\n

我看到了 的示例endesive,但我认为endesive使用RSA ,并且我想使用ECDSA来实现

\n

我不知道是否没关系,因为p12包含了一切。

\n
import datetime\nfrom cryptography.hazmat import backends\nfrom cryptography.hazmat.primitives.serialization import pkcs12\n\nfrom endesive.pdf import cms\n\n#nuevo = cms.sign()\n\n\n\ndef firmar(contrase\xc3\xb1a, certificado, pdf):\n    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)\n    date = date.strftime("D:%Y%m%d%H%M%S+00\'00\'")\n    dct = {\n        "aligned": 0,\n        "sigflags": 3,\n        "sigflagsft": 132,\n        "sigpage": 0,\n        "sigbutton": True,\n        "sigfield": "Signature1",\n        "auto_sigfield": True,\n        "sigandcertify": True,\n        "signaturebox": (470, 840, 570, 640),\n        "signature": "Aqu\xc3\xad va la firma",\n        # "signature_img": "signature_test.png",\n        "contact": "hola@ejemplo.com",\n        "location": "Ubicaci\xc3\xb3n",\n        "signingdate": date,\n        "reason": "Raz\xc3\xb3n",\n        "password": contrase\xc3\xb1a,\n    }\n    # with open("cert.p12", "rb") as fp:\n    p12 = pkcs12.load_key_and_certificates(\n        certificado.read(), contrase\xc3\xb1a.encode("ascii"), backends.default_backend()\n    )\n\n    print(p12[0])\n    print(p12[1])\n    print(p12[2])\n    #datau = open(fname, "rb").read()\n    datau = pdf.read()\n    datas = cms.sign(datau, dct, p12[0], p12[1], [], "sha256")\n    #nuevo = cms.sign()\n    return datau, datas\n    """\n    fname = "test.pdf"\n    with open(fname, "wb") as fp:\n        fp.write(datau)\n        fp.write(datas)\n    """\n
Run Code Online (Sandbox Code Playgroud)\n

mva*_*val 6

PyHanko支持 ECDSA——以及其他几种签名算法,几乎支持最新版本的 PDF 标准(+扩展)允许的所有算法。

这是一个非常基本的 PKCS#12 使用示例:

from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
from pyhanko.sign import signers


signer = signers.SimpleSigner.load_pkcs12(
    pfx_file='signer.pfx', passphrase=b'secret'
)

with open('document.pdf', 'rb') as doc:
    w = IncrementalPdfFileWriter(doc)
    out = signers.sign_pdf(
        w, signers.PdfSignatureMetadata(field_name='Signature1'),
        signer=signer,
    )

    # do stuff with 'out'...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将根据 PKCS#12 文件中的密钥类型自动检测签名算法,因此无需显式指定 ECDSA。有关更高级的用法,请参阅文档

(全面披露:我编写/维护 pyHanko)