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 vários usuários. 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-C.git. | |
SharedPtr<FileFormatInfo> info = FileFormatUtil::DetectFileFormat(MyDir + u"Digitally signed.docx"); | |
if (info->get_HasDigitalSignature()) | |
{ | |
std::cout << (String::Format(u"Document {0} has digital signatures, ", System::IO::Path::GetFileName(MyDir + u"Digitally signed.docx")) + | |
u"they will be lost if you open/save this document with Aspose.Words.") | |
<< std::endl; | |
} |
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-C.git. | |
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"); | |
DigitalSignatureUtil::Sign(MyDir + u"Digitally signed.docx", ArtifactsDir + u"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-C.git. | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
auto signatureLineOptions = MakeObject<SignatureLineOptions>(); | |
signatureLineOptions->set_Signer(u"vderyushev"); | |
signatureLineOptions->set_SignerTitle(u"QA"); | |
signatureLineOptions->set_Email(u"vderyushev@aspose.com"); | |
signatureLineOptions->set_ShowDate(true); | |
signatureLineOptions->set_DefaultInstructions(false); | |
signatureLineOptions->set_Instructions(u"Please sign here."); | |
signatureLineOptions->set_AllowComments(true); | |
SharedPtr<SignatureLine> signatureLine = builder->InsertSignatureLine(signatureLineOptions)->get_SignatureLine(); | |
signatureLine->set_ProviderId(System::Guid::Parse(u"CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2")); | |
doc->Save(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx"); | |
auto signOptions = MakeObject<SignOptions>(); | |
signOptions->set_SignatureLineId(signatureLine->get_Id()); | |
signOptions->set_ProviderId(signatureLine->get_ProviderId()); | |
signOptions->set_Comments(u"Document was signed by vderyushev"); | |
signOptions->set_SignTime(System::DateTime::get_Now()); | |
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"); | |
DigitalSignatureUtil::Sign(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx", | |
ArtifactsDir + u"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-C.git. | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"Test Signed PDF."); | |
auto saveOptions = MakeObject<PdfSaveOptions>(); | |
saveOptions->set_DigitalSignatureDetails(MakeObject<PdfDigitalSignatureDetails>(CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"), u"reason", | |
u"location", System::DateTime::get_Now())); | |
doc->Save(ArtifactsDir + u"WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions); |
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-C.git. | |
auto doc = MakeObject<Document>(MyDir + u"Digitally signed.docx"); | |
for (const auto& digitalSignature : doc->get_DigitalSignatures()) | |
{ | |
auto signatureValue = System::Convert::ToBase64String(digitalSignature->get_SignatureValue()); | |
ASSERT_EQ(u"K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbDMhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/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-C.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(MyDir + u"Digitally signed.docx", ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx"); | |
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams: | |
{ | |
SharedPtr<System::IO::Stream> streamIn = MakeObject<System::IO::FileStream>(MyDir + u"Digitally signed.docx", System::IO::FileMode::Open); | |
{ | |
SharedPtr<System::IO::Stream> streamOut = | |
MakeObject<System::IO::FileStream>(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx", System::IO::FileMode::Create); | |
DigitalSignatureUtil::RemoveAllSignatures(streamIn, streamOut); | |
} | |
} | |
// Verify that both our output documents have no digital signatures. | |
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx")->get_Count()); | |
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx")->get_Count()); |