Προσθήκη Ψηφιακών Υπογραφών σε Παρουσιάσεις σε PHP
Επισκόπηση
Μια ψηφιακή υπογραφή βοηθά έναν παραλήπτη να προσδιορίσει ποιος υπέγραψε μια παρουσίαση και αν το υπογεγραμμένο περιεχόμενο έχει αλλάξει. Τρία σχετιζόμενα θέματα ασφαλείας είναι σημαντικά εδώ:
- Ένα ψηφιακό πιστοποιητικό είναι ένα ηλεκτρονικό διαπιστευτήριο που συνδέει μια ταυτότητα με ένα δημόσιο κλειδί. Μια αξιόπιστη αρχή πιστοποίησης (CA) μπορεί να εκδώσει ένα πιστοποιητικό, ή ένας οργανισμός μπορεί να χρησιμοποιήσει ένα αυτο-υπογεγραμμένο πιστοποιητικό για εσωτερικές ροές εργασίας.
- Μια ψηφιακή υπογραφή δημιουργείται από το περιεχόμενο της παρουσίασης και το ιδιωτικό κλειδί του κατόχου του πιστοποιητικού. Το δημόσιο κλειδί του πιστοποιητικού μπορεί στη συνέχεια να χρησιμοποιηθεί για την επαλήθευση της υπογραφής. Μια υπογραφή παρέχει απόδειξη προέλευσης και ακεραιότητας· δεν κρυπτογραφεί την παρουσίαση.
- Προστασία με κωδικό ελέγχει αν ένας χρήστης μπορεί να ανοίξει ή να τροποποιήσει μια παρουσίαση. Είναι ξεχωριστή από την ψηφιακή υπογραφή και περιγράφεται στο Password-Protected Presentations.
Το PowerPoint παρέχει την εντολή Add a Digital Signature κάτω από File > Info > Protect Presentation.

Αφού ανοίξει μια υπογεγραμμένη παρουσίαση, το PowerPoint μπορεί να εμφανίσει μια ειδοποίηση κατάστασης υπογραφής.

Το Aspose.Slides αποκαλύπτει τις υπογραφές μέσω του Presentation::getDigitalSignatures, ο οποίος επιστρέφει ένα DigitalSignatureCollection των οποίων τα στοιχεία αντιπροσωπεύονται από αντικείμενα DigitalSignature . Μια παρουσίαση μπορεί να περιέχει πολλές υπογραφές.
Κατανόηση Πιστοποιητικών PFX και Κωδικών
Ένα αρχείο PFX, επίσης γνωστό ως αρχείο PKCS#12 και συνήθως με την επέκταση .pfx ή .p12, μπορεί να περιέχει ένα πιστοποιητικό X.509, το ιδιωτικό του κλειδί και την αλυσίδα του πιστοποιητικού. Το ιδιωτικό κλειδί είναι αυτό που επιτρέπει στον κάτοχο να δημιουργήσει μια υπογραφή. Ένα πιστοποιητικό χωρίς προσβάσιμο ιδιωτικό κλειδί δεν μπορεί να χρησιμοποιηθεί για την υπογραφή μιας παρουσίασης.
Ο κωδικός PFX προστατεύει το πακέτο του πιστοποιητικού και το ιδιωτικό κλειδί. Δεν είναι κωδικός για το άνοιγμα ή την επεξεργασία της παρουσίασης. Μην καταχωρείτε αρχεία PFX ή τους κωδικούς τους σε σύστημα ελέγχου εκδόσεων. Σε παραγωγή, περιορίστε την πρόσβαση στο αρχείο πιστοποιητικού και αποκτήστε τον κωδικό του από ένα μυστικό αποθετήριο ή άλλη ασφαλή πηγή ρυθμίσεων. Τα παρακάτω παραδείγματα χρησιμοποιούν μια μεταβλητή περιβάλλοντος μόνο για να αποφεύγουν την ενσωμάτωση του κωδικού στον κώδικα.
Προσθήκη Ψηφιακής Υπογραφής σε Παρουσίαση
Για να υπογράψετε μια πραγματική ροή εργασίας παρουσίασης, φορτώστε ένα υπάρχον αρχείο PPTX, δημιουργήστε ένα DigitalSignature από ένα πιστοποιητικό PFX και τον κωδικό του, προσθέστε την υπογραφή στη συλλογή της παρουσίασης και αποθηκεύστε σε ένα αρχείο PPTX.
$certificatePassword = getenv("PFX_PASSWORD");
if ($certificatePassword === false || $certificatePassword === "") {
throw new RuntimeException("Set the PFX_PASSWORD environment variable.");
}
$presentation = new Presentation("InputPresentation.pptx");
try {
$signature = new DigitalSignature("signing-certificate.pfx", $certificatePassword);
$signature->setComments("Approved for release.");
$presentation->getDigitalSignatures()->add($signature);
$presentation->save("InputPresentation-signed.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Η αποθήκευση του αποτελέσματος με νέο όνομα διατηρεί το αρχικό αρχείο χωρίς υπογραφή. Η τιμή που ορίζεται από το DigitalSignature::setComments περιγράφει τον σκοπό της υπογραφής· δεν είναι έλεγχος ασφαλείας.
Επικύρωση Ψηφιακών Υπογραφών
Όταν φορτώνετε ένα υπογεγραμμένο αρχείο PPTX, εξετάστε κάθε στοιχείο που επιστρέφεται από το Presentation::getDigitalSignatures. Η μέθοδος DigitalSignature::isValid δείχνει αν η ενσωματωμένη υπογραφή είναι έγκυρη για το τρέχον περιεχόμενο της παρουσίασης.
$presentation = new Presentation("InputPresentation-signed.pptx");
try {
$signatures = $presentation->getDigitalSignatures();
$signatureCount = java_values($signatures->size());
if ($signatureCount === 0) {
echo "The presentation does not contain digital signatures." . PHP_EOL;
} else {
$allSignaturesAreValid = true;
$signTimeFormat = new Java("java.text.SimpleDateFormat", "yyyy-MM-dd HH:mm:ss");
$certificateFactoryClass = new JavaClass("java.security.cert.CertificateFactory");
$certificateFactory = $certificateFactoryClass->getInstance("X.509");
for ($index = 0; $index < $signatureCount; $index++) {
$signature = $signatures->get_Item($index);
$signatureIsValid = java_values($signature->isValid());
$signatureStatus = $signatureIsValid ? "VALID" : "INVALID";
$formattedSignTime = java_values($signTimeFormat->format($signature->getSignTime()));
$certificateData = $signature->getCertificate();
$certificateStream = new Java("java.io.ByteArrayInputStream", $certificateData);
try {
$certificate = $certificateFactory->generateCertificate($certificateStream);
$signerName = java_values($certificate->getSubjectX500Principal()->getName());
} finally {
$certificateStream->close();
}
echo $signerName . ", " . $formattedSignTime . " -- " . $signatureStatus . PHP_EOL;
$allSignaturesAreValid = $allSignaturesAreValid && $signatureIsValid;
}
if ($allSignaturesAreValid) {
echo "All embedded signatures are valid for the current presentation." . PHP_EOL;
} else {
echo "At least one embedded signature is invalid." . PHP_EOL;
}
}
} finally {
$presentation->dispose();
}
Ένα μη έγκυρο αποτέλεσμα συνήθως σημαίνει ότι το υπογεγραμμένο περιεχόμενο της παρουσίασης ή τα δεδομένα της υπογραφής άλλαξαν μετά την υπογραφή, ή ότι το αρχείο είναι κατεστραμμένο. Η αφαίρεση κάθε υπογραφής παράγει μια παρουσίαση χωρίς υπογραφή, έτσι ο έλεγχος μόνο της εγκυρότητας των στοιχείων δεν αρκεί: μια ροή εργασίας ευαίσθητη στην ασφάλεια πρέπει επίσης να επαληθεύει ότι ο αναμενόμενος αριθμός υπογραφών και οι ταυτοτήτες των υπογραφόντων είναι παρόντες.
Αυτό το αποτέλεσμα εγκυρότητας δεν πρέπει να αντιμετωπίζεται ως πλήρης απόφαση εμπιστοσύνης πιστοποιητικού. Ανάλογα με την πολιτική ασφαλείας σας, η εφαρμογή σας μπορεί επίσης να χρειάζεται να δημιουργήσει και να επικυρώσει την αλυσίδα πιστοποιητικών X.509, να ελέγξει τις ημερομηνίες εγκυρότητας του πιστοποιητικού και την κατάσταση ανάκλησής του, να επιβεβαιώσει το αναμενόμενο θέμα ή αποτύπωση, να επαληθεύσει τη χρήση κλειδιού και να αξιολογήσει μια έμπιστη χρονική σήμανση. Η τιμή DigitalSignature::getSignTime από μόνη της δεν αποτελεί απόδειξη από αξιόπιστη αρχή χρονικής σήμανσης.
Αφαίρεση Ψηφιακών Υπογραφών
Η αφαίρεση υπογραφών αλλάζει την κατάσταση ασφαλείας της παρουσίασης. Το παρακάτω παράδειγμα φορτώνει ένα υπογεγραμμένο αρχείο PPTX, αφαιρεί όλες τις υπογραφές με το DigitalSignatureCollection::clear και αποθηκεύει ένα αντίγραφο χωρίς υπογραφή.
$presentation = new Presentation("InputPresentation-signed.pptx");
try {
$presentation->getDigitalSignatures()->clear();
$presentation->save("InputPresentation-unsigned.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Για να αφαιρέσετε μόνο μία υπογραφή, καλέστε το DigitalSignatureCollection::removeAt με το μηδενικό δείκτη του. Αποθηκεύστε σε νέο αρχείο εκτός αν η αντικατάσταση του υπογεγραμμένου αρχικού είναι ρητό μέρος της ροής εργασίας σας.
Επεξεργασία και Σκέψεις για τη Μορφή
- Μια υπογραφή δεν κάνει την παρουσίαση μόνο για ανάγνωση. Οι χρήστες και οι εφαρμογές μπορούν ακόμη να επεξεργαστούν το αρχείο, αλλά οι αλλαγές στο υπογεγραμμένο περιεχόμενο συνήθως ακυρώνουν την υπάρχουσα υπογραφή.
- Ολοκληρώστε όλες τις προγραμματισμένες επεξεργασίες πριν την υπογραφή. Εάν πρέπει να αλλάξει μια παρουσίαση, αποθηκεύστε τη διορθωμένη έκδοση και υπογράψτε ξανά αυτήν την επανέκδοση.
- Διατηρήστε το τελικό αποτέλεσμα σε μορφή PPTX. Η μετατροπή μιας υπογεγραμμένης παρουσίασης σε άλλη μορφή δεν μεταφέρει την αρχική υπογραφή PPTX ως έγκυρη υπογραφή για το μετατρεπόμενο αρχείο.
- Θεωρήστε το ιδιωτικό κλειδί του πιστοποιητικού ως ευαίσθητο. Οποιοσδήποτε αποκτήσει το ιδιωτικό κλειδί και τον κωδικό του ενδέχεται να μπορεί να δημιουργήσει υπογραφές που φαίνονται να προέρχονται από τον κάτοχο του πιστοποιητικού.
- Διατηρήστε το μη υπογεγραμμένο πηγαίο αρχείο ή ένα άλλο ελεγχόμενο αντίγραφο όταν η πολιτική διατήρησης εγγράφων το απαιτεί.
FAQ
Κρυπτογραφεί η ψηφιακή υπογραφή την παρουσίαση;
Όχι. Μια ψηφιακή υπογραφή παρέχει απόδειξη προέλευσης και ακεραιότητας, αλλά το περιεχόμενο της παρουσίασης παραμένει αναγνώσιμο εκτός αν εφαρμοστεί ξεχωριστή κρυπτογράφηση. Χρησιμοποιήστε την password protection όταν απαιτείται περιορισμένη πρόσβαση στο περιεχόμενο.
Είναι ο κωδικός PFX ο ίδιος με τον κωδικό της παρουσίασης;
Όχι. Ο κωδικός PFX ξεκλειδώνει το ιδιωτικό κλειδί που είναι αποθηκευμένο στο πακέτο του πιστοποιητικού. Δεν ελέγχει ποιος μπορεί να ανοίξει ή να επεξεργαστεί το αρχείο PPTX.
Μπορώ να χρησιμοποιήσω αυτο-υπογεγραμμένο πιστοποιητικό;
Τεχνικά, ένα αυτο-υπογεγραμμένο πιστοποιητικό μπορεί να χρησιμοποιηθεί όταν περιλαμβάνει προσβάσιμο ιδιωτικό κλειδί. Οι παραλήπτες δεν θα το εμπιστευτούν αυτόματα, εκτός αν το πιστοποιητικό έχει προσθεθεί ρητά στο αξιόπιστο περιβάλλον τους. Οι δημόσιες ή δια-οργανωτικές ροές εργασίας συνήθως χρησιμοποιούν ένα πιστοποιητικό που εκδόθηκε από αξιόπιστη CA.
Τι κάνει μια υπογραφή μη έγκυρη;
Η αλλαγή του υπογεγραμμένου περιεχομένου της παρουσίασης ή των δεδομένων της υπογραφής μετά την υπογραφή μπορεί να ακυρώσει την υπογραφή. Η φθορά του αρχείου μπορεί επίσης να προκαλέσει αποτυχία επικύρωσης. Εάν αφαιρεθούν όλες οι υπογραφές, η παρουσίαση θα είναι χωρίς υπογραφή αντί για αρχείο που περιέχει μη έγκυρη υπογραφή.
Σημαίνει μια έγκυρη υπογραφή ότι πρέπει να εμπιστευθώ τον υπογράφοντα;
Όχι από μόνη της. Η ακεραιότητα της υπογραφής και η εμπιστοσύνη στον υπογράφοντα είναι ξεχωριστές αποφάσεις. Μια πολιτική επικύρωσης παραγωγής θα πρέπει επίσης να ελέγχει την αλυσίδα πιστοποιητικών, την περίοδο ισχύος, την κατάσταση ανάκλησης, την αναμενόμενη ταυτότητα, τη χρήση κλειδιού και τυχόν απαιτήσεις έμπιστου χρονικού σήματος.
Τι συμβαίνει όταν λήξει το πιστοποιητικό;
Η λήξη του πιστοποιητικού δεν αλλάζει τα bytes της παρουσίασης, αλλά επηρεάζει την αξιολόγηση της εμπιστοσύνης του πιστοποιητικού. Το αν μια υπογραφή παραμένει αποδεκτή εξαρτάται από την πολιτική σας και από το αν υπάρχει έγκυρη έμπιστη χρονική σήμανση που αποδεικνύει ότι η υπογραφή έγινε ενώ το πιστοποιητικό ήταν έγκυρο. Μην βασίζεστε μόνο στην εμφανιζόμενη ώρα υπογραφής ως έμπιστη χρονική σήμανση.
Μπορεί μια υπογεγραμμένη παρουσίαση να επεξεργαστεί ακόμη;
Ναι. Η υπογραφή δεν κλειδώνει το αρχείο. Η επεξεργασία του υπογεγραμμένου περιεχομένου γενικά ακυρώνει την υπάρχουσα υπογραφή, ώστε τελειώστε πρώτα την παρουσίαση και υπογράψτε την τελική επανέκδοση.
Μπορεί μια παρουσίαση να περιέχει περισσότερες από μία υπογραφές;
Ναι. Προσθέστε κάθε υπογραφή στη συλλογή που επιστρέφεται από το Presentation::getDigitalSignatures πριν αποθηκεύσετε. Κατά την επικύρωση, εξετάστε κάθε υπογραφή και επιβεβαιώστε ότι όλοι οι απαιτούμενοι υπογράφοντες είναι παρόντες.
Ποιοι τύποι παρουσίασης υποστηρίζουν αυτές τις λειτουργίες;
Το Aspose.Slides υποστηρίζει τις λειτουργίες ψηφιακής υπογραφής που περιγράφονται εδώ μόνο για PPTX. Οι μορφές παρουσίασης PPT και OpenDocument δεν υποστηρίζονται από αυτήν τη ροή εργασίας API.
Μπορώ να αφαιρέσω μια υπογραφή χωρίς να επηρεάσω τις διαφάνειες;
Ναι. Μπορείτε να αφαιρέσετε μία υπογραφή ή να εκκαθαρίσετε ολόκληρη τη συλλογή και μετά να αποθηκεύσετε την παρουσίαση. Το περιεχόμενο των διαφανειών παραμένει διαθέσιμο, αλλά το αποθηκευμένο αρχείο δεν φέρει πλέον την απόδειξη της αφαιρεμένης υπογραφής.