Teknik Makale

İmzalı PDF'te Neyin Değiştiğini Sınıflandırmak

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ı

mlNone'dan mlUnclassified'a PDFlibPas değişiklik seviyesi merdiveninin DocMDP politika uygulamasını Delphi'de tek bir karşılaştırma olarak gösteren şeması
TPLModificationLevel merdiveni mlNone'dan mlUnclassified'a uzanır ve DocMDP uygulaması, hesaplanan seviyeyi politikayla karşılaştırmaya indirgenir

İ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

PDFlibPas'ın her değişmiş PDF nesnesine uyguladığı karar ağacı; güncellemeleri arşiv, form doldurma, açıklama ya da sınıflandırılmamış seviyelere ayırır
Her değişmiş nesne, ne olduğuna göre sınıflandırılır — güvenlik deposu, xref akışı, alan, açıklama — asla onu üreten çağrıya göre değil

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

PDFlibPas'ta iki geçişli PDF revizyon farkı: önce sayfa sayısı denetimi, 64 bitlik parmak izleri, parmak izi hizalaması sonra nesne numarası eşleştirmesi
Karşılaştırma motoru normalleştirilmiş nesne gövdelerinin parmak izini alır, önce sayfa sayısı farklarını raporlar, sonra parmak izine ve nesne numarasına göre eşleştirir

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