Trabajar con firmas digitales

Una firma digital se utiliza para autenticar un documento y establecer que el remitente del documento es quien dice ser y que el contenido del documento no ha sido alterado.

Aspose.Words admite documentos con firmas digitales y brinda acceso a ellos, lo que le permite detectar y validar firmas digitales en un documento y firmar un documento PDF generado con un certificado proporcionado. Actualmente, las firmas digitales se admiten en documentos DOC, OOXML y ODT. La firma de documentos generados se admite en formato PDF.

Las firmas digitales no se conservan al abrir y guardar

Un punto importante a tener en cuenta es que un documento cargado y luego guardado usando Aspose.Words perderá todas las firmas digitales firmadas en el documento. Esto se debe a que una firma digital garantiza que el contenido no haya sido modificado y además autentifica la identidad de quien firmó el documento. Estos principios quedarían invalidados si las firmas originales se trasladaran al documento resultante.

Debido a esto, si procesa documentos cargados en un servidor, esto podría significar que puede dañar un documento cargado en su servidor de esta manera sin saberlo. Por lo tanto, es mejor verificar si hay firmas digitales en un documento y tomar las medidas adecuadas si se encuentra alguna; por ejemplo, se puede enviar una alerta al cliente informándole que el documento que está entregando contiene firmas digitales que se perderán si se procesada. Puede descargar el archivo de plantilla de este ejemplo desde aquí.

El código anterior utiliza el método FileFormatUtil.detect_file_format para detectar si un documento contiene firmas digitales sin cargar el documento primero. Esto proporciona una manera eficiente y segura de verificar las firmas de un documento antes de procesarlas. Cuando se ejecuta, el método devuelve un objeto FileFormatInfo que proporciona la propiedad FileFormatInfo.has_digital_signature. Esta propiedad devuelve verdadero si el documento contiene una o más firmas digitales. Es importante tener en cuenta que este método no valida las firmas, solo determina si las firmas están presentes. La validación de firmas digitales se trata en la siguiente sección.

Firmas digitales en macros (proyectos VBA)

No se puede acceder ni firmar las firmas digitales en macros. Esto se debe a que Aspose.Words no trata directamente las macros de un documento. Sin embargo, las firmas digitales en las macros se conservan al exportar el documento a cualquier formato de Word. Estas firmas se pueden conservar en el código VBA porque el contenido binario de las macros no se modifica incluso si se modifica el documento en sí.

Acceder y verificar firmas digitales

Un documento puede tener varias firmas digitales. Se puede acceder a todas estas firmas a través de la colección Document.digital_signatures. Cada objeto devuelto es un DigitalSignature que representa una única firma digital perteneciente al documento. Esto proporciona miembros que le permiten verificar la validez de la firma.

La propiedad más importante que se debe verificar con las firmas digitales es la validez de cada firma en el documento. Todas las firmas del documento se pueden validar a la vez llamando a la propiedad DigitalSignatureCollection.is_valid. Esto devolverá verdadero si todas las firmas del documento son válidas o si el documento no tiene firmas y falso si al menos una firma digital no es válida.

Cada firma también se puede validar individualmente llamando a DigitalSignature.is_valid. Una firma puede no ser válida por varios motivos, por ejemplo, el documento ha cambiado desde la firma o el certificado ha caducado. Además, también se puede acceder a detalles adicionales de la firma. El siguiente ejemplo de código muestra cómo validar cada firma en un documento y mostrar información básica sobre la firma. Puede descargar el archivo de plantilla de este ejemplo desde aquí.

Firmar documentos de Word

La clase DigitalSignatureUtil proporciona métodos para firmar documentos. El método DigitalSignatureUtil.sign firma el documento de origen utilizando CertificateHolder determinado con firma digital y escribe el documento firmado en el flujo de destino.

El siguiente ejemplo muestra cómo firmar un documento simple.

El siguiente ejemplo muestra cómo firmar un documento cifrado.

Firmar un documento de Word con la línea de firma

Puede firmar el documento de origen utilizando CertificateHolder y SignOptions determinados con firma digital y escribir el documento firmado en el archivo de destino. Usando la clase SignOptions puede especificar opciones para la firma de documentos. El siguiente ejemplo muestra cómo crear una nueva línea de firma y firmar un documento.

El siguiente ejemplo muestra cómo modificar la línea de firma existente y firmar el documento.

Firmar un documento de Word utilizando el identificador del proveedor de firmas

El siguiente ejemplo muestra cómo firmar un documento de Word utilizando el identificador del proveedor de firma. El proveedor de servicios criptográficos (CSP) es un módulo de software independiente que en realidad realiza algoritmos criptográficos para autenticación, codificación y cifrado. MS Office reserva el valor de {00000000-0000-0000-0000-000000000000} para su proveedor de firma predeterminado.

Cree un nuevo documento de Word con signo de línea de firma utilizando el identificador de proveedor

El siguiente ejemplo muestra cómo crear una línea de firma y firmar un documento de Word utilizando el identificador del proveedor de firma.

Recuperar el valor de la firma digital

Aspose.Words también brinda la capacidad de recuperar el valor de la firma digital de un documento firmado digitalmente como una matriz de bytes utilizando la propiedad SignatureValue.

El siguiente ejemplo de código muestra cómo obtener el valor de la firma digital como una matriz de bytes de un documento:

doc = aw.Document(MY_DIR + "Digitally signed.docx")

for digital_signature in doc.digital_signatures:
    signature_value = base64.b64encode(digital_signature.signature_value)
    print(f"Base64 signature value is: {signature_value}")