Trabalhar com assinaturas digitais
Uma assinatura digital é uma implementação tecnológica de assinaturas eletrónicas para assinar documentos e autenticar o signatário para garantir que um documento não foi modificado desde a sua assinatura. Cada assinatura digital é única para cada signatário, pois segue o protocolo PKI para gerar chaves públicas e privadas. Assinar um documento digitalmente significa criar uma assinatura usando a chave privada do signatário, onde um algoritmo matemático é usado para criptografar o hash gerado.
Aspose.Words permite detectar, contar ou verificar assinaturas digitais existentes e também adicionar uma nova assinatura ao seu documento para descobrir qualquer adulteração nele. Também é possível remover todas as assinaturas digitais de um documento. Use a classe DigitalSignatureUtil para trabalhar com assinaturas digitais.
Este artigo explica como fazer tudo o que precede para validar a autenticidade e integridade de um documento digital.
Experimente online
Pode experimentar esta funcionalidade com o nosso Assinatura online gratuita.
Formatos Suportados
Aspose.Words permite trabalhar com assinaturas digitais em documentos DOC, OOXML e ODT e assinar o documento gerado no formato PDF ou XPS.
Limitações das Assinaturas Digitais
A tabela abaixo descreve algumas limitações que você pode enfrentar ao trabalhar com assinaturas digitais através de Aspose.Words, bem como algumas opções alternativas.
Limitação | Opção alternativa |
---|---|
Perda de assinaturas digitais num documento depois de O carregar e guardar. Portanto, o processamento de um documento para um servidor pode causar a perda de todas as assinaturas digitais sem aviso prévio. | Verifique se um documento tem assinaturas digitais e tome as medidas adequadas, se forem encontradas. Por exemplo, enviar um alerta aos clientes informando-os de que o documento que estão a enviar contém assinaturas digitais que serão perdidas se forem processadas. |
Aspose.Words suporta trabalhar com macros num documento. Mas Aspose.Words ainda não suporta assinaturas digitais em macros. | Exporte o documento de volta para qualquer formato do Word e utilize Microsoft Word para adicionar uma assinatura digital às macros. |
Detectar, contar e verificar assinaturas digitais
Aspose.Words permite detectar a assinatura digital num documento utilizando o método DetectFileFormat e a propriedade HasDigitalSignature. Vale a pena notar que tal verificação detectará apenas o fato da assinatura, mas não sua validade.
Um documento pode ser assinado mais de uma vez, e isso pode ser feito por diferentes utilizadores. Para verificar a validade das assinaturas digitais, você precisa carregá-las do documento usando o método LoadSignatures e usar a propriedade IsValid. Além disso, Aspose.Words permite contar um conjunto de todas as assinaturas digitais dentro de um documento usando a propriedade Count.
Tudo isto proporciona uma forma eficiente e segura de verificar a existência de assinaturas num documento antes de o processar.
O exemplo de código a seguir mostra como detectar a presença de assinaturas digitais e verificá-las:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
FileFormatInfo info = FileFormatUtil.detectFileFormat(getMyDir() + "Digitally signed.docx"); | |
if (info.hasDigitalSignature()) | |
{ | |
System.out.println("Document {Path.GetFileName(MyDir + "); | |
} |
Criar uma assinatura digital
Para criar uma assinatura digital, você precisará carregar um certificado de assinatura que confirme a identidade. Ao enviar um documento assinado digitalmente, você também envia seu certificado e chave pública.
Aspose.Words permite criar o certificado X. 509, um certificado digital que utiliza a norma X. 509 PKI internacionalmente aceite para verificar se uma chave pública pertence ao signatário incluído no certificado. Para fazer isso, use o método Create dentro da classe CertificateHolder.
As próximas secções explicam como adicionar uma assinatura digital, uma linha de assinatura e como assinar um documento PDF gerado.
Assinar um documento
Aspose.Words permite assinar um documento DOC, DOCX ou ODT digitalmente utilizando o método Sign e as propriedades SignOptions.
O exemplo de código a seguir mostra como assinar documentos usando um detentor de certificado e opções de assinatura:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
CertificateHolder certHolder = CertificateHolder.create(getMyDir() + "morzal.pfx", "aw"); | |
DigitalSignatureUtil.sign(getMyDir() + "Digitally signed.docx", getArtifactsDir() + "Document.Signed.docx", | |
certHolder); |
Adicionar uma linha de assinatura
Uma linha de assinatura é uma representação visual de uma assinatura digital num documento. Aspose.Words permite inserir uma linha de assinatura usando o método DocumentBuilder.InsertSignatureLine. Você também pode definir os parâmetros para esta representação usando a classe SignatureLineOptions.
Por exemplo, a figura abaixo mostra como assinaturas válidas e inválidas podem ser exibidas.


Além disso, se um documento contiver uma linha de assinatura e nenhuma assinatura digital, existe um recurso para solicitar ao usuário que adicione uma assinatura.
O exemplo de código a seguir mostra como assinar um documento com um certificado pessoal e uma linha de assinatura específica:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
SignatureLineOptions signatureLineOptions = new SignatureLineOptions(); | |
{ | |
signatureLineOptions.setSigner("yourname"); | |
signatureLineOptions.setSignerTitle("Worker"); | |
signatureLineOptions.setEmail("yourname@aspose.com"); | |
signatureLineOptions.setShowDate(true); | |
signatureLineOptions.setDefaultInstructions(false); | |
signatureLineOptions.setInstructions("Please sign here."); | |
signatureLineOptions.setAllowComments(true); | |
} | |
SignatureLine signatureLine = builder.insertSignatureLine(signatureLineOptions).getSignatureLine(); | |
signatureLine.setProviderId(UUID.fromString("CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2")); | |
doc.save(getArtifactsDir() + "SignDocuments.SignatureLineProviderId.docx"); | |
SignOptions signOptions = new SignOptions(); | |
{ | |
signOptions.setSignatureLineId(signatureLine.getId()); | |
signOptions.setProviderId(signatureLine.getProviderId()); | |
signOptions.setComments("Document was signed by Aspose"); | |
signOptions.setSignTime(new Date()); | |
} | |
CertificateHolder certHolder = CertificateHolder.create(getMyDir() + "morzal.pfx", "aw"); | |
DigitalSignatureUtil.sign(getArtifactsDir() + "SignDocuments.SignatureLineProviderId.docx", | |
getArtifactsDir() + "SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions); |
Assinar um documento PDF gerado
Aspose.Words permite assinar e obter todos os detalhes de um documento PDF usando as propriedades PdfDigitalSignatureDetails.
O exemplo de código a seguir mostra como assinar um PDFgerado:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.writeln("Test Signed PDF."); | |
PdfSaveOptions saveOptions = new PdfSaveOptions(); | |
{ | |
saveOptions.setDigitalSignatureDetails(new PdfDigitalSignatureDetails( | |
CertificateHolder.create(getMyDir() + "morzal.pfx", "aw"), "reason", "location", | |
new Date())); | |
} | |
doc.save(getArtifactsDir() + "WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions); |
A figura abaixo demonstra que o documento PDF gerado é aberto em Adobe Acrobat e a assinatura digital é verificada como presente e válida.
Recuperar o valor da Assinatura Digital
Aspose.Words também fornece a capacidade de recuperar o valor da assinatura digital de um documento assinado digitalmente como uma matriz de bytes usando a propriedade SignatureValue.
O exemplo de código a seguir mostra como obter o valor da assinatura digital como uma matriz de bytes de um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Digitally signed.docx"); | |
for (DigitalSignature digitalSignature : doc.getDigitalSignatures()) | |
{ | |
String signatureValue = Base64.getEncoder().encodeToString(digitalSignature.getSignatureValue()); | |
Assert.assertEquals("K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbD" + | |
"MhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm" + | |
"+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue); | |
} |
Remover Assinaturas Digitais
Aspose.Words permite remover todas as assinaturas digitais de um documento assinado utilizando o método RemoveAllSignatures.
O exemplo de código a seguir mostra como carregar e remover assinaturas digitais de um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
// There are two ways of using the DigitalSignatureUtil class to remove digital signatures | |
// from a signed document by saving an unsigned copy of it somewhere else in the local file system. | |
// 1 - Determine the locations of both the signed document and the unsigned copy by filename strings: | |
DigitalSignatureUtil.removeAllSignatures(getMyDir() + "Digitally signed.docx", | |
getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromString.docx"); | |
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams: | |
try (FileInputStream streamIn = new FileInputStream(getMyDir() + "Digitally signed.docx")) | |
{ | |
try (FileOutputStream streamOut = new FileOutputStream(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx")) | |
{ | |
DigitalSignatureUtil.removeAllSignatures(streamIn, streamOut); | |
} | |
} | |
// Verify that both our output documents have no digital signatures. | |
Assert.assertEquals(IterableUtils.size(DigitalSignatureUtil.loadSignatures(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromString.docx")), 0); | |
Assert.assertEquals(IterableUtils.size(DigitalSignatureUtil.loadSignatures(getArtifactsDir() + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx")), 0); |