ele*_*ded 2 python pdf signing digital ecdsa
我想用 Python 中的p12证书对 PDF 进行签名,但我不知道如何开始、使用哪些库或如何操作。
\n我很了解数字签名的工作原理,但我想用 Python 来实现。如果有任何帮助,我将不胜感激。
\n我看到了 的示例endesive,但我认为endesive使用RSA ,并且我想使用ECDSA来实现。
我不知道是否没关系,因为p12包含了一切。
\nimport 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 """\nRun Code Online (Sandbox Code Playgroud)\n
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)
| 归档时间: |
|
| 查看次数: |
4161 次 |
| 最近记录: |