Το PDFiumPas γράφει κρυπτογράφηση ISO/TS 32003 μέσω της SaveAsEncrypted: ορίστε το Revision σε erR7 και κάθε string και stream προστατεύεται με AES-256 σε λειτουργία GCM, τον authenticated cipher που απέκτησε το PDF 2.0 το 2023. Ορίστε επίσης το EnableIntegrityProtection και το έγγραφο φέρει επιπλέον ένα αυτόνομο token PDF MAC, το οποίο η ValidatePdfMac ελέγχει στην πλευρά της ανάγνωσης
Πρόκειται για δύο διαφορετικές προστασίες που ο κόσμος συχνά συγχέει. Το GCM πιστοποιεί κάθε κρυπτογραφημένη τιμή. Το MAC πιστοποιεί το έγγραφο ως σύνολο. Θέλετε και τα δύο, για διαφορετικούς λόγους
Τι προσθέτει το GCM που το CBC δεν πρόσφερε ποτέ;
Πιστοποίηση του ciphertext. Το AES-256 σε λειτουργία CBC, το σχήμα AESV3 στο ISO 32000-2, διατηρεί το περιεχόμενο εμπιστευτικό και δεν λέει τίποτα για το αν έφτασε χωρίς τροποποίηση. Το CBC είναι malleable με συγκεκριμένους, καλά μελετημένους τρόπους: ένας επιτιθέμενος που μπορεί να αναστρέψει bits στο ciphertext παράγει προβλέψιμες αλλαγές στο plaintext του επόμενου block, και τίποτα στη μορφή δεν το προσέχει
Το GCM κλείνει αυτό το κενό. Κάθε κρυπτογραφημένη τιμή φέρει μια ετικέτα πιστοποίησης 16 bytes, σειριοποιημένη πλήρως όπως απαιτεί το ISO/TS 32003, και η αποκρυπτογράφηση αποτυγχάνει αντί να επιστρέφει αλλοιωμένο plaintext όταν η ετικέτα δεν ταιριάζει. Σε όρους PDF, ένα παραποιημένο string ή stream σε ένα έγγραφο AESV4 είναι σοβαρό σφάλμα τη στιγμή της χρήσης, όχι μια περίεργη τιμή που διαδίδεται στην εφαρμογή σας. Το Encrypt dictionary το σημειώνει με /CFM /AESV4 και V 6 / R 7, μαζί με μια καταχώρηση επεκτάσεων που δηλώνει /ExtensionLevel 32003 και /ExtensionRevision (:2023)
Τρεις αναθεωρήσεις, τρία οικοσυστήματα
Το TPdfEncryptionRevision προσφέρει erR5, erR6 και erR7, και η επιλογή είναι περισσότερο απόφαση συμβατότητας παρά κρυπτογραφική. Το R5 είναι το αρχικό σχήμα AES-256 που δημοσιεύτηκε ως επέκταση PDF 1.7, με ένα μοναδικό hash κωδικού πρόσβασης SHA-256, και ανοίγει ουσιαστικά σε οτιδήποτε από τα τελευταία δεκαπέντε χρόνια. Το R6 είναι η ενισχυμένη παραγωγή κλειδιού που τυποποιήθηκε στο ISO 32000-2, χρησιμοποιώντας την επαναληπτική κατασκευή SHA-256/384/512 του αλγορίθμου 2.B, και είναι αυτό που περιμένει μια σύγχρονη ροή εργασίας PDF 2.0 ή PDF/A-4. Το R7 είναι το ISO/TS 32003, χρησιμοποιώντας την ίδια παραγωγή 2.B με AES-GCM ως cipher
Η υποστήριξη readers τρέχει ακριβώς με αυτή τη σειρά, και η υποστήριξη R7 παραμένει ακόμη περιορισμένη εκτός των τρεχόντων mainstream viewers. Αυτό είναι το ίδιο trade-off που διέπει κάθε χαρακτηριστικό PDF 2.0: η νεότερη επιλογή είναι η καλύτερη μηχανική και το στενότερο κοινό. Αποφασίστε βάσει του ποιος πρέπει να ανοίξει το αρχείο, και αν η απάντηση είναι "ένα σύστημα αρχειοθέτησης που κανείς δεν έχει ενημερώσει από το 2019", η απάντηση είναι R5 ανεξάρτητα από ό,τι προτιμά η πολιτική ασφάλειας
uses
PDFium, FPdfEncrypt;
var
Pdf: TPdf;
Opts: TPdfEncryptOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'quarterly-report.pdf';
Pdf.LoadDocument;
Opts := TPdfEncryptOptions.Default;
Opts.UserPassword := 'open-secret';
Opts.OwnerPassword := 'admin-secret';
Opts.EncryptMetadata := True;
Opts.Revision := erR7; // ISO/TS 32003 AESV4-GCM
Opts.EnableIntegrityProtection := True; // αυτόνομο token PDF MAC
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
Γιατί ένα MAC εγγράφου πάνω από έναν πιστοποιημένο cipher;
Επειδή οι ετικέτες GCM προστατεύουν τις τιμές, όχι τη διάταξη των τιμών. Κάθε string και stream σε ένα έγγραφο AESV4 πιστοποιείται μεμονωμένα, ωστόσο ο πίνακας cross-reference, η αρίθμηση αντικειμένων και το trailer είναι δομή, όχι κρυπτογραφημένο περιεχόμενο. Ένας επιτιθέμενος δεν μπορεί να πλαστογραφήσει ένα stream, όμως τίποτα στον cipher από μόνο του δεν τον εμποδίζει να αναδιατάξει σε ποια αντικείμενα δείχνει το έγγραφο, ή να ενσωματώσει αντικείμενα από παλαιότερη αναθεώρηση του ίδιου αρχείου
Το αυτόνομο token PDF MAC απευθύνεται σε αυτό το επίπεδο. Το PDFiumPas το παράγει από το κλειδί κρυπτογράφησης αρχείου με ένα αποκλειστικό /KDFSalt 32 bytes καταγεγραμμένο στο Encrypt dictionary, οπότε η κατοχή του κωδικού πρόσβασης είναι αυτό που επιτρέπει σε έναν reader να επιβεβαιώσει το token. Το αποτέλεσμα είναι μία απάντηση σε ένα ερώτημα: είναι αυτό το έγγραφο, ως σύνολο, το έγγραφο που γράφτηκε
var
Pdf: TPdf;
Mac: TPdfMacValidationResult;
begin
Pdf := TPdf.Create(nil);
try
Pdf.Password := 'open-secret';
Pdf.FileName := 'quarterly-report.enc.pdf';
Pdf.LoadDocument;
Mac := Pdf.ValidatePdfMac('open-secret');
case Mac.Status of
pmvsValid: ProcessDocument(Pdf);
pmvsNotPresent: ProcessWithWarning(Pdf); // κανένα token σε αυτό το αρχείο
pmvsInvalid: Quarantine(Mac.MessageText); // παραποιημένο ή περικομμένο
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
Οι τέσσερις τιμές κατάστασης χρειάζονται τέσσερις διαφορετικές αντιδράσεις, και η συμπίεσή τους σε μια boolean χάνει τη διάκριση που έχει σημασία. Το pmvsNotPresent σημαίνει ότι το αρχείο απλώς δεν έχει token, κάτι που περιγράφει σχεδόν κάθε κρυπτογραφημένο PDF γραμμένο πριν το 2024 και δεν είναι απόδειξη τίποτα. Το pmvsInvalid σημαίνει ότι υπάρχει token και δεν επαληθεύεται, κάτι που είναι γνήσιο εύρημα και θα έπρεπε να σταματήσει την επεξεργασία. Το pmvsUnsupported σημαίνει ότι το token υπάρχει σε μορφή που αυτή η έκδοση δεν υλοποιεί, κάτι που είναι κενό συμβατότητας, όχι επίθεση. Η αντιμετώπιση του "δεν υπάρχει" ως "άκυρο" θα έβαζε σε καραντίνα ολόκληρο το ιστορικό σας από την πρώτη ημέρα
Τι δεν κάνει ακόμη η κρυπτογράφηση
Οι σημαίες δικαιωμάτων παραμένουν αυτό που ήταν πάντα: ένα αίτημα προς το συμμορφούμενο λογισμικό, όχι έλεγχος. Τα bits /P από τον Πίνακα 22 του ISO 32000-1 που απαγορεύουν εκτύπωση ή εξαγωγή τα τηρούν οι καλά συμπεριφερόμενοι viewers και τα αγνοούν όλα τα υπόλοιπα, και όποιος κατέχει τον κωδικό πρόσβασης χρήστη κατέχει ήδη το αποκρυπτογραφημένο περιεχόμενο. Η κρυπτογράφηση είναι το όριο· τα δικαιώματα περιγράφουν την πρόθεση εντός του
Δύο λειτουργικές λεπτομέρειες αξίζει να σχεδιαστούν εκ των προτέρων. Πρώτον, η κρυπτογράφηση και η μεταγενέστερη τροποποίηση αλληλεπιδρούν: η προσάρτηση μιας incremental update σε ένα κρυπτογραφημένο έγγραφο έχει τους δικούς της κανόνες, που καλύπτονται στο incremental updates σε κρυπτογραφημένα PDF, και ένα token MAC είναι μια δήλωση σε επίπεδο εγγράφου που μια απρόσεκτη προσάρτηση θα ακυρώσει. Δεύτερον, η κατασκευή GCM χρησιμοποιεί έναν ντετερμινιστικό μετρητή IV, και το PDFiumPas εγείρει εξαίρεση αντί να επαναχρησιμοποιήσει τιμή μετρητή αν αυτός ο χώρος εξαντλούνταν ποτέ, επειδή η επαναχρησιμοποίηση nonce στο GCM είναι καταστροφική με τρόπο που η σιωπηλή υπερχείλιση θα έκρυβε
Επιλογή ανάμεσα στις τρεις αναθεωρήσεις στην πράξη
Καταγράψτε ποιος ανοίγει το αρχείο, και μετά επιλέξτε. Για εσωτερική διανομή όπου κάθε reader είναι σύγχρονος viewer υπό τον έλεγχό σας, το R7 με προστασία ακεραιότητας είναι η ισχυρότερη διαθέσιμη επιλογή και δεν υπάρχει λόγος να μην το χρησιμοποιήσετε. Για έγγραφα που φεύγουν από τον οργανισμό, το R6 είναι η υπερασπίσιμη προεπιλογή: είναι τυποποιημένο στο ISO 32000-2 και όχι σε τεχνική προδιαγραφή πάνω από αυτό, και η υποστήριξη είναι ευρεία. Για αρχεία και παλαιούς καταναλωτές, το R5 είναι η μόνη επιλογή που αξιόπιστα ανοίγει, και θα έπρεπε να καταγράψετε γιατί στο ίδιο σημείο όπου καταγράφετε την υπόλοιπη πολιτική διατήρησής σας
Όποιο κι αν επιλέξετε, επαληθεύστε την έξοδο αντί να εμπιστευτείτε ότι η κλήση πέτυχε. Ανοίξτε ξανά το κρυπτογραφημένο αρχείο, ελέγξτε το ValidatePdfMac, και επιβεβαιώστε ότι η δηλωμένη έκδοση είναι αυτή που περιμένετε, χρησιμοποιώντας τους ελέγχους συμμόρφωσης έκδοσης στο ακριβής συμμόρφωση έκδοσης PDF. Μια ευρύτερη λίστα ελέγχου εισαγωγής για μη έμπιστα έγγραφα βρίσκεται στο έλεγχος κινδύνων ασφάλειας PDF
Το PDFiumPas είναι ένα component Delphi και Lazarus γύρω από τη μηχανή PDFium με τη στοίβα κρυπτογράφησης PDF 2.0 υλοποιημένη εγγενώς σε Pascal, οπότε το AES-256, το GCM και το token MAC δεν χρειάζονται εξωτερικό DLL κρυπτογραφίας. Το API κρυπτογράφησης τεκμηριώνεται στη σελίδα του PDFium Delphi component