Bir PDF üzerindeki imza sonraki değişiklikleri yasaklamaz. Bayt aralığını sabitler ve artımlı bir güncelleme, ondan sonra yeni baytlar ekler; böylece imza matematiksel olarak geçerli kalırken belge yeni içerik kazanır. O içeriğin kabul edilebilir olup olmadığı bir politika sorusudur ve DocMDP, yazarın politikayı beyan ettiği yerdir: hiç değişiklik yok, yalnızca form doldurma ve imzalama ya da bunlara ek olarak açıklamalar. Onu uygulamak, gerçekte neyin değiştiğini sınıflandırmak demektir; AnalyzeModifications da tam olarak bunu yapar. Onu önceki bir revizyona yönlendirin, sonra genel hüküm için GetModificationLevel okuyun ve her farkın seviyesi, nesne numarası ve açıklaması için bulgu başına erişicileri kullanın
Bu yerleştikten sonra DocMDP uygulaması bir karşılaştırmaya iner: hesaplanan seviye, politikanın izin verdiği seviyede ya da altında mı
İmzalı bir PDF neden değişmesi beklenen bir şeydir
Üç meşru durum var ve göreceğinizin çoğunu bunlar kapsar. İkinci bir imzalayan, kendi imzasını ekler. Bir alıcı, yazarın açık bıraktığı form alanlarını doldurur. Ve uzun süreli doğrulama malzemesi eklenir: yanıtlayıcılar ortadan kalktıktan sonra imzanın doğrulanabilir kalması için OCSP yanıtları ve CRL'ler belge güvenlik deposuna yazılır. Sonuncusu yalnızca izinli değildir; iyi yönetilen bir arşivin imzalı belgelere bilinçli olarak yaptığı şeydir
Dolayısıyla "imzadan sonra dosya büyüdü" ifadesi hiçbir bilgi taşımaz. Soru her zaman neyin eklendiğidir ve cevap, baytları izlemekten değil belge durumlarını karşılaştırmaktan gelmelidir. Ekleme mekaniğinin kendisi artımlı güncelleme makalesinde ele alınır
Nesneyi üreten yola göre değil, nesnenin biçimine göre sınıflandır
Sınıflandırıcı, değişiklikten sonra bir nesnenin ne olduğuna bakar, onu hangi kitaplık çağrısının ürettiğine değil. Bu kasıtlıdır, çünkü analiz başka yazılımların ürettiği dosyalar üzerinde çalışır ve orada incelemeye açık bir çağrı yolu yoktur
Dört biçim tanınır. Belge güvenlik deposu ve doğrulamayla ilgili bilgi sözlükleri, çapraz başvuru akış nesneleri, katalog metadata girdisi ve bayt aralığı taşıyan imza sözlükleri uzun süreli arşiv malzemesidir. Hem alan türü hem alan değeri taşıyan bir nesne form doldurmadır. Türü annotation olan ya da alt türü ISO 32000-2 Tablo 168'de listelenenlerden biri olan nesne bir açıklama değişikliğidir. Gerisi sınıflandırılmamıştır
Kaldırmalar eklemelerden daha katı ele alınır. Kaldırılmış bir nesne yalnızca eski taraftaki nesnenin kendisi arşiv malzemesiyken beyaz listeye girer; bu, güvenlik deposunun daha yenisiyle değiştirilmesinin olağan durumunu kapsar. Diğer her kaldırma sınıflandırılmamıştır, çünkü imzalı bir belgeden içerik silmek bir izin seviyesinin yetkilendirdiği bir şey değildir. Belge düzeyindeki farklar daha da katıdır: sayfa sayısındaki bir değişiklik, tek tek nesnelere bakılmadan doğrudan sınıflandırılmamışa gider; hiçbir DocMDP seviyesi sayfa eklemeye ya da çıkarmaya izin vermez
Beyaz liste reddetme yönünde hata yapar
Sınır durumlarda her kararı yöneten tasarım kuralı budur. Yanlışlıkla izinli olarak sınıflandırılan bir değişiklik, yazarın hiç yetkilendirmediği içerik üzerinde doğrulanan bir imzadır. Yanlışlıkla sınıflandırılmamış olarak sınıflandırılan bir değişiklik, işaretlenen ve bir kişi tarafından gözden geçirilen bir belgedir. Bu iki hata simetrik değildir; dolayısıyla beyaz liste dar kalır ve tanınmayan biçimler tahmin edilmek yerine sınıflandırılmamışa düşer
Bunun önceden sezilmeye değer pratik bir sonucu var: sıra dışı üreticilerden gelen dosyalar bazen, incelendiğinde zararsız olan sınıflandırılmamış değişiklikler raporlar. Doğru tepki, beyaz listeyi genişletmek yerine bulgu ayrıntısına ve nesne numarasına bakmaktır; çünkü tek tek raporları susturmak için büyüyen bir beyaz liste, bir güvenlik kontrolü olmayı bırakır
uses
PDFlibrary, PDFlibCompare;
var
Pdf: TPDFlib;
I, Level: Integer;
begin
Pdf := TPDFlib.Create(nil);
try
Pdf.LoadFromFile('contract-countersigned.pdf', '');
if Pdf.AnalyzeModifications('contract-as-signed.pdf', '') < 0 then
raise Exception.Create('the earlier revision could not be loaded');
// TPLModificationLevel sıralaması mlNone, mlLTAUpdates, mlFormFilling,
// mlAnnotations, mlUnclassified; erişici sıra numarasını döndürür
Level := Pdf.GetModificationLevel;
// DocMDP uygulaması artık politikaya karşı tek bir karşılaştırma
if Level > Ord(mlFormFilling) then
for I := 0 to Pdf.GetModificationFindingCount - 1 do
Report.Add(Format('object %d, level %d: %s',
[Pdf.GetModificationFindingObjNum(I),
Pdf.GetModificationFindingLevel(I),
Pdf.GetModificationFindingDetail(I)]));
finally
Pdf.Free;
end;
end;
Genel seviye tüm bulguların üst sınırıdır ve savunulabilir tek toplama budur: doksan dokuz arşiv ekleme ve bir sınıflandırılmamış değişiklik içeren belge, sınıflandırılmamış değişiklik içeren bir belgedir
Altında: kriptografik özetler değil, parmak izleri
CompareWith üzerinden açılan ve değişiklik analizinin üzerine kurulduğu karşılaştırma motoru, nesneleri normalleştirilmiş gövdelerinin parmak iziyle tanımlar ve SHA-256 yerine kriptografik olmayan 64 bitlik bir özet kullanır. Bu düşünülmüş bir tercihtir. Yapısal karşılaştırmanın ihtiyacı belirli olmaktır: aynı nesne gövdesi bir çalışma içinde her zaman aynı parmak izini üretmelidir. Çarpışma direncine ihtiyacı yoktur, çünkü karşılaştırmanın iki tarafını da denetleyen bir saldırgan zaten başka yollarla kazanmıştır ve milyonluk nesneli bir belgedeki her nesne için tam bir kriptografik özet bedeli, karşılığı olmayan gerçek bir maliyettir
Özet seçiminden daha önemli iki normalleştirme kuralı vardır. Dolaylı başvurular, başvurulan içeriğe açılmak yerine bir yer tutucu simgeye katlanır: açmak, paylaşılan bir nesnenin gövdesini her gönderene kopyalardı; böylece paylaşılan bir font tanımlayıcısında yapılan küçük bir düzenleme, ona ulaşan her nesnenin parmak izini geçersiz kılar ve rapor okunmaz hâle gelirdi. Ve nesne numaralarının kendisi parmak izinden hariç tutulur, çünkü bir yeniden yazım, hiçbir şeyi anlamsal olarak değiştirmeden nesneleri yeniden numaralandırabilir
Eşleştirme sonra iki geçişte çalışır: önce parmak izine göre hizalama, kalanın nesne numarasına göre eşleştirilmesi de bir değişikliği ekleme artı kaldırma yerine tanımlamak içindir. Ucuz denetimler baştan sona önce gelir: sayfa sayısı farkı, herhangi bir nesne gezinmesi başlamadan önce raporlanır
Bir tuzak: öz karşılaştırmanın özdeş çıkacağı garanti değildir
Bir fark motoru için doğal ilk test, bir dosyayı kendisiyle karşılaştırmak ve sonucun özdeş olduğunu savunmaktır. Bu sav burada tutmaz ve nedeni öğreticidir. Genel yükleme yolu ile daha alt düzey belge yükleme yolu kod çözmeyi aynı biçimde yapılandırmaz; dolayısıyla aynı dosya iki yoldan yüklendiğinde bazı nesneler için farklı parmak izleri üretebilir. Motor yanlış değildir; iki yükleme gerçekten farklı bellek içi durumlar üretti
İki yolu zorla birleştirmek yerine karşılaştırma anlamı dar biçimde tanımlanır: analiz, geçerli belge durumunu önceki bir revizyonla karşılaştırır ve özdeş yalnızca iki parmak izi kümesi tam olarak örtüştüğünde raporlar. Kullanıcıların gerçekte sorduğu soru budur ve iki yükleyicinin birbirinin yerine geçmesini gerektirmez. Bir karşılaştırma özelliği tasarlarken "aynı"nın ne anlama geldiğini tanımlamak, onu hesaplamaktan daha büyük işi oluşturur
Nerede kullanılır
İki yerde. Bir doğrulama raporunda, imza denetiminin yanında; böylece gözden geçiren yalnızca imzanın kriptografik olarak sağlam olup olmadığını değil, sonrasında belgeye ne olduğunu da görür; imza tarafı PAdES imzalama ve doğrulamada ele alınır. Ve bir giriş kapısında, dışarıdan gelen belgenin gönderdiğiniz kopyayla denetlendiği yerde; böylece eklenmiş bir açıklamayla geri dönen sözleşme, sayfası düzenlenmiş olandan farklı ele alınır
Kapsamla ilgili bir uyarı. Bu analiz, aynı belge soyundan iki revizyon arasında neyin değiştiğini söyler. Görünür içeriğin yanıltıcı olup olmadığını, bir form alanı görünüm akışının değerine örtüşüp örtüşmediğini ya da bir katman altına gizlenmiş metnin içerik akışında hâlâ bulunup bulunmadığını söylemez. Bunlar ayrı ele almaya muhtaçtır ve içerik kaldırma tarafı gerçek redaksiyon makalesinde kapsanır. Analiz ve karşılaştırma giriş noktaları losLab PDF Developer Library ürün sayfasında belgelenir