← Wszystkie przewodniki

Jak mogę udowodnić, że plik PDF nie został zmieniony?

Aby udowodnić, że plik PDF nie został zmieniony, zapisz kryptograficzny skrót pliku w znanym momencie, powiąż ten skrót z zaufanym znacznikiem czasu wystawionym przez stronę trzecią i prowadź weryfikowalny zapis wszystkiego, co od tego czasu działo się z dokumentem. Skrót ujawnia każdą zmianę, znacznik czasu ustala moment, a zapis pokrywa okres pomiędzy. Zgodność z PDF/A ani metadane pliku nie dowodzą żadnej z tych rzeczy.

Dlaczego oczywiste metody zawodzą

Najpierw przychodzą do głowy trzy podejścia i wszystkie trzy są słabsze, niż się wydaje.

Metadane pliku. Otwarcie właściwości dokumentu i porównanie daty utworzenia z datą modyfikacji wygląda na kontrolę. Nią nie jest. Samo pobranie pliku może zaktualizować czas modyfikacji, choć nie zmienił się ani jeden bajt, a wiele narzędzi edycyjnych pozostawia pola autora i producenta nietknięte. Metadane zapisuje ten, kto ostatni trzymał plik, czyli dokładnie strona, o której postępowanie chodzi.

Zgodność z PDF/A. PDF/A to format archiwalny. Usuwa funkcje, które mogłyby sprawić, że dokument w przyszłości wyświetli się inaczej, na przykład osadzone skrypty i odwołania do zewnętrznych czcionek. To wartościowe i nie mówi nic o tym, czy treść się zmieniła. Plik PDF/A można edytować i zapisać ponownie jako w pełni zgodny plik PDF/A.

Wklejony podpis. Zeskanowany podpis wstawiony do dokumentu jest obrazkiem. Nie ma żadnego kryptograficznego związku z otaczającymi go bajtami.

Co naprawdę działa

Trzy mechanizmy, które odpowiadają na trzy różne pytania. Pominięcie jednego zostawia lukę.

1. Skrót kryptograficzny, aby wykryć zmianę. Funkcja skrótu sprowadza plik do odcisku o stałej długości. Zmiana jednego bitu w dowolnym miejscu całkowicie zmienia odcisk. SHA-256 lub SHA-384 to dziś rozsądny wybór. Skrót dowodzi, że plik, który masz teraz, jest bajt po bajcie tym samym plikiem, z którego go wyliczono.

Sam w sobie nie dowodzi nic o kiedy ani o tym, kto go wyliczył. Skrót, który sam obliczyłeś i zapisałeś we własnej bazie, pozostaje twoim słowem.

2. Zaufany znacznik czasu, aby ustalić moment. RFC 3161 opisuje, jak wysłać skrót do urzędu znacznika czasu i otrzymać podpisany token zawierający ten skrót oraz czas. Na zewnątrz wychodzi wyłącznie skrót, więc sam dokument nigdy nie opuszcza twoich systemów.

To jest część, która zamienia twoje twierdzenie w dowód od strony trzeciej, ponieważ poświadczenie podpisuje ktoś, kto nie ma interesu w twoim dokumencie.

3. Łańcuch nadzoru, aby pokryć lukę. Skrót i znacznik czasu dowodzą stanu pliku w jednym momencie. Audytor pyta o okres między tym momentem a dniem dzisiejszym. Łańcuch nadzoru na to odpowiada: każda czynność na dokumencie, kto ją wykonał, kiedy i skąd, zapisywana wyłącznie przez dopisywanie, aby żaden wpis nie mógł po cichu zniknąć.

Powiązanie każdego wpisu ze skrótem poprzedniego sprawia, że usunięcie w środku łamie łańcuch. To właśnie czyni brak manipulacji możliwym do wykazania, a nie jedynie deklarowanym.

Co przechowywać w praktyce

Przechowuj razem dokument, skrót, token znacznika czasu i łańcuch nadzoru, w formacie, który otworzysz jeszcze za dziesięć lat. W praktyce oznacza to PDF/A-3 dla dokumentu, bo ten format dopuszcza załączniki i może przenosić dowód obok pliku.

Zachowaj także materiał weryfikacyjny. Token znacznika czasu weryfikuje się względem łańcucha certyfikatów urzędu, a certyfikaty wygasają. Jeśli chcesz w 2035 roku zweryfikować to, co oznaczyłeś w 2026, musisz zachować łańcuch i status unieważnienia w takiej postaci, w jakiej były wtedy. Ten materiał jest dostępny dziś, a później już nie będzie.

Gdzie mieści się SealDoc

SealDoc automatyzuje te trzy mechanizmy. Każdy przetwarzany dokument staje się plikiem PDF/A-3B zwalidowanym względem ISO 19005-3, domyślnie opatrzonym znacznikiem czasu RFC 3161, z łańcuchem skrótów SHA-384 i zapisem łańcucha nadzoru. Eksport to pakiet dowodowy dla każdego dokumentu na żądanie: dokument, ścieżka audytu oraz manifest pieczętujący zarówno poszczególne pliki, jak i cały zestaw.

Ostatnio sprawdzono: