Работа с цифрови подписи

Цифровият подпис е технологично приложение на електронните подписи за подписване и удостоверяване на подписа, за да се гарантира, че документът не е бил изменян от момента на подписването му. Всеки цифров подпис е уникален за всеки подпис, поради следването на протокола PKI за генериране на публични и частни ключове. Подписване на документ дигитално означава създаване на подпис с помощта на частния ключ на подписвача, където се използва математически алгоритъм за криптиране на генерирания хашиш.

Aspose.Words ви позволява да откривате, броите или проверявате съществуващи цифрови подписи, а също и да добавяте нов подпис към документа си, за да разберете каквото и да е подправяне в него. Можете също така да премахнете всички цифрови подписи от документ. Използвайте DigitalSignatureUtil клас за работа с цифрови подписи.

Тази статия обяснява как да се направи всичко това, за да се потвърди автентичността и целостта на цифров документ.

Поддържани формати

Aspose.Words ви позволява да работите с цифрови подписи върху документи DOC, OOXML и ODT и да подписвате генерирания документ в PDF или XPS формат.

Ограничения на цифровите подписи

Таблицата по-долу описва няколко ограничения, с които може да се сблъскате, докато работите с цифрови подписи чрез Aspose.Words, както и някои алтернативни варианти.

Ограничения Алтернативен вариант
Загуба на цифрови подписи на документ след зареждане и запазване. Следователно обработката на документ на сървър може да причини загуба на всички цифрови подписи без предизвестие Проверете дали документът има цифрови подписи и предприемете необходимите действия, ако има такива. Например, изпратете сигнал на клиентите, за да ги информират, че документът, който качват, съдържа цифрови подписи, които ще бъдат изгубени, ако бъде обработен
Aspose.Words подкрепя работата с макроси в документ. Но… Aspose.Words все още не подкрепя цифровите подписи на макроси Експортиране на документа обратно във формат Word и използване Microsoft Word да се добави цифров подпис към макросите

Откриване, преброяване и проверка на цифрови подписи

Aspose.Words ви позволява да откриете цифров подпис в документ, като използвате DetectFileFormat метод и HasDigitalSignature собственост. Струва си да се отбележи, че такава проверка ще открие само факта на подписа, но не и валидността му.

Документ може да бъде подписан повече от веднъж и това може да се направи от различни потребители. За да проверите валидността на цифровите подписи, трябва да ги заредите от документа с помощта на LoadSignatures метод и използване на IsValid собственост. Също така Aspose.Words ви позволява да брои набор от всички цифрови подписи в рамките на документ, използвайки Count собственост.

Всичко това осигурява ефективен и безопасен начин за проверка на документ за подпис, преди да го обработва.

Следният пример с код показва как да се засече наличието на цифрови подписи и да се проверят:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
FileFormatInfo info = FileFormatUtil.DetectFileFormat(MyDir + "Digitally signed.docx");
if (info.HasDigitalSignature)
{
Console.WriteLine(
$"Document {Path.GetFileName(MyDir + "Digitally signed.docx")} has digital signatures, " +
"they will be lost if you open/save this document with Aspose.Words.");
}

Създаване на цифров подпис

За да създадете цифров подпис, ще трябва да заредите удостоверение за подписване, което потвърждава самоличността. Когато изпращате цифрово подписан документ, изпращате и вашия сертификат и публичен ключ.

Aspose.Words ви позволява да създадете X.509 сертификат, дигитален сертификат, който използва международно приетия X.509 PKI стандарт, за да се провери дали публичният ключ принадлежи към подписа, включен в сертификата. За целта използвайте Create метод в рамките на CertificateHolder Клас.

Следващите раздели обясняват как да се добави цифров подпис, линия за подпис и как да се подпише генериран PDF документ.

Подпис на документ

Aspose.Words ви позволява да подпишете DOC, DOCX, XPS, или ОДТ документ дигитално с помощта на Sign метод и SignOptions имоти.

Следният пример за код показва как да се подпишат документи, като се използва притежател на сертификат и опции за подписване:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw");
DigitalSignatureUtil.Sign(MyDir + "Digitally signed.docx", ArtifactsDir + "Document.Signed.docx",
certHolder);

Добавяне на подпис

Линията на подпис е визуално представяне на цифров подпис в документ. Aspose.Words ви позволява да поставите линия за подпис с помощта на DocumentBuilder.InsertSignatureLine метод. Можете също така да зададете параметрите за това представяне с помощта на SignatureLineOptions Клас.

Например, снимката по-долу показва колко валидни и невалидни подписи могат да бъдат показани.

drawing drawing

Също така, ако документът съдържа линия за подпис и няма цифров подпис, има функция, която да поиска от потребителя да добави подпис.

Следният пример за код показва как да се подпише документ с личен сертификат и определен подпис:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
SignatureLineOptions signatureLineOptions = new SignatureLineOptions
{
Signer = "yourname",
SignerTitle = "Worker",
Email = "yourname@aspose.com",
ShowDate = true,
DefaultInstructions = false,
Instructions = "Please sign here.",
AllowComments = true
};
SignatureLine signatureLine = builder.InsertSignatureLine(signatureLineOptions).SignatureLine;
signatureLine.ProviderId = Guid.Parse("CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2");
doc.Save(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx");
SignOptions signOptions = new SignOptions
{
SignatureLineId = signatureLine.Id,
ProviderId = signatureLine.ProviderId,
Comments = "Document was signed by Aspose",
SignTime = DateTime.Now
};
CertificateHolder certHolder = CertificateHolder.Create(MyDir + "morzal.pfx", "aw");
DigitalSignatureUtil.Sign(ArtifactsDir + "SignDocuments.SignatureLineProviderId.docx",
ArtifactsDir + "SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions);

Подпис на генериран PDF документ

Aspose.Words ви позволява да подпишете и да получите всички подробности за PDF документ с помощта на PdfDigitalSignatureDetails имоти.

Следният пример с код показва как да се подпише генериран PDF:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Writeln("Test Signed PDF.");
PdfSaveOptions saveOptions = new PdfSaveOptions
{
DigitalSignatureDetails = new PdfDigitalSignatureDetails(
CertificateHolder.Create(MyDir + "morzal.pfx", "aw"), "reason", "location",
DateTime.Now)
};
doc.Save(ArtifactsDir + "WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions);

Изтегляне на стойността на цифровия подпис

Aspose.Words Също така предоставя възможност за извличане на стойността на цифровия подпис от цифров подписан документ като байт масив с помощта на SignatureValue собственост.

Следният пример за код показва как да се получи стойността на цифровия подпис като байт масив от документ:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document doc = new Document(MyDir + "Digitally signed.docx");
foreach (DigitalSignature digitalSignature in doc.DigitalSignatures)
{
string signatureValue = Convert.ToBase64String(digitalSignature.SignatureValue);
Assert.AreEqual("K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbD" +
"MhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm" +
"+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue);
}

Премахване на цифровите подписи

Aspose.Words ви позволява да премахнете всички цифрови подписи от подписан документ с помощта на RemoveAllSignatures метод.

Следният пример за код показва как да се зареди и премахне цифровите подписи от документ:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.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 + "Digitally signed.docx",
ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx");
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams:
using (Stream streamIn = new FileStream(MyDir + "Digitally signed.docx", FileMode.Open))
{
using (Stream streamOut = new FileStream(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx", FileMode.Create))
{
DigitalSignatureUtil.RemoveAllSignatures(streamIn, streamOut);
}
}
// Verify that both our output documents have no digital signatures.
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromString.docx"), Is.Empty);
Assert.That(DigitalSignatureUtil.LoadSignatures(ArtifactsDir + "DigitalSignatureUtil.LoadAndRemove.FromStream.docx"), Is.Empty);