עבודה עם חתימות דיגיטליות

חתימה דיגיטלית היא יישום טכנולוגי של חתימות אלקטרוניות לחתום על מסמכים ולאמת את החותם כדי להבטיח כי מסמך לא הותאם מאז חתימתו. כל חתימה דיגיטלית היא ייחודית עבור כל חותם בגלל ביצוע פרוטוקול 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-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;
}

צור חתימה דיגיטלית

כדי ליצור חתימה דיגיטלית, תידרש לטעון תעודת חתימה המאשרת זהות. כשאתה שולח מסמך חתום דיגיטלית, אתה שולח גם את האישור והמפתח הציבורי שלך.

Aspose.Words מאפשר לך ליצור תעודת איקס 509, תעודה דיגיטלית המשתמשת בתקן המקובל בעולם איקס 509 PKI כדי לוודא שמפתח ציבורי שייך לחותם הכלול בתעודה. לשם כך, השתמש בשיטת Create בתוך הכיתה CertificateHolder.

הסעיפים הבאים מסבירים כיצד להוסיף חתימה דיגיטלית, שורת חתימה וכיצד לחתום על מסמך שנוצר PDF.

חתום על מסמך

Aspose.Words מאפשר לך לחתום על מסמך DOC, DOCX או ODT באופן דיגיטלי באמצעות שיטת Sign ו SignOptions מאפיינים.

דוגמת הקוד הבאה מראה כיצד לחתום על מסמכים באמצעות בעל אישור ואפשרויות חתימה:

// 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);
view raw sign-document.h hosted with ❤ by GitHub

הוסף שורת חתימה

שורת חתימה היא ייצוג חזותי של חתימה דיגיטלית במסמך. Aspose.Words מאפשר לך להוסיף שורת חתימה בשיטת DocumentBuilder.InsertSignatureLine. ניתן גם להגדיר את הפרמטרים לייצוג זה באמצעות הכיתה SignatureLineOptions.

לדוגמה, התמונה למטה מראה כיצד ניתן להציג חתימות תקפות ולא חוקיות.

valid-signature invalid-signature

כמו כן, אם מסמך מכיל שורת חתימה ואין חתימה דיגיטלית, יש תכונה לבקש מהמשתמש להוסיף חתימה.

דוגמת הקוד הבאה מראה כיצד לחתום על מסמך עם אישור אישי ושורת חתימה ספציפית:

// 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);

חתום על מסמך שנוצר PDF

Aspose.Words מאפשר לך לחתום ולקבל את כל הפרטים של מסמך PDF באמצעות המאפיינים PdfDigitalSignatureDetails.

דוגמת הקוד הבאה מראה כיצד לחתום על PDFשנוצר:

// 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);

אחזר את ערך החתימה הדיגיטלית

Aspose.Words מספק גם את היכולת לאחזר את ערך החתימה הדיגיטלית ממסמך חתום דיגיטלית כמערך בתים באמצעות המאפיין SignatureValue.

דוגמת הקוד הבאה מראה כיצד להשיג את ערך החתימה הדיגיטלית כמערך בתים ממסמך:

// 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);
}

הסר חתימות דיגיטליות

Aspose.Words מאפשר לך להסיר את כל החתימות הדיגיטליות ממסמך חתום בשיטת RemoveAllSignatures.

דוגמת הקוד הבאה מראה כיצד לטעון ולהסיר חתימות דיגיטליות ממסמך:

// 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());