Artımlı güncellemeler ve neden önemli oldukları
ISO 32000-2 §7.5.6 Evidence: Standard-backed
Bir bakışta
“Bir bakışta” başlıklı bölümBir PDF yazıldıktan sonra değiştirildiğinde, onu güvenli biçimde kaydetmenin yolu dosyayı yeniden yazmak değildir. Bunun yerine, değişen nesneleri ve yeni bir çapraz başvuru bölümünü sona eklersiniz; özgün baytların her birini bulunduğu yerde bırakırsınız. Bu sayfa, bunun nasıl çalıştığını ve bir dijital imzanın sonraki bir düzenlemeden sonra neden bozulmadan kalabildiğini açıklar.
Bu neden önemli
“Bu neden önemli” başlıklı bölümBir imza, belirli bir bayt aralığını korur. Tek sözcüklük bir değişikliği kaydetmek bile dosyayı yeniden yazsaydı, her bayt uzaklığı kayardı. İmzalanan aralık artık aynı içeriğe karşılık gelmezdi. İmzalanan içeriğin kendisine dokunulmamış olsa bile imza bozulurdu.
Artımlı güncellemeler tam da bunu önlemek için vardır. Bir imzanın kapsadığı baytlar dahil olmak üzere özgün baytlar yerinde kalır. Bir inceleyici, imzalanıp ardından düzenlenmiş bir belgeyi alıp ilk imzayı özgün revizyona göre doğrulayabilir. İnceleyici, tam olarak neyin imzalandığını ve sonradan neyin değiştiğini ayrıca görür. Bunu yanlış yaparsanız, ya geçerli imzaları geçersiz kılarsınız ya da daha kötüsü, bir imzanın gerçekte neyi onayladığını kanıtlama yeteneğini kaybedersiniz.
Kısa açıklaması
“Kısa açıklaması” başlıklı bölüm- Bir artımlı güncelleme sona ekleme yapar: yeni ve değiştirilmiş nesneler, ardından yeni bir çapraz başvuru bölümü, ardından yeni bir kuyruk (trailer), hepsi dosyanın sonuna eklenir.
- Özgün dosya içeriği olduğu gibi bırakılır — yerinde düzenleme yapılmaz.
- Yeni kuyrukta bir
/Prevgirişi bulunur: önceki çapraz başvuru bölümünün bayt uzaklığı. Bölümler geriye doğru bir zincir oluşturur. - Bir okuyucu dizinini, bu zinciri en yeni bölümden başlayarak izleyerek oluşturur. Herhangi bir nesne numarası için en güncel giriş geçerli olur.
- Hiçbir şeyin üzerine yazılmadığı için, daha önceki bir imzanın kapsadığı bayt aralığı hâlâ bayt bayt aynıdır — bu nedenle imza hâlâ doğrulanır ve belgeyi imzalandığı andaki haliyle tam olarak yeniden oluşturabilirsiniz.
NextPDF buna nasıl yaklaşır
“NextPDF buna nasıl yaklaşır” başlıklı bölümNextPDF, temel belgeyi önceki sayfada açıklandığı gibi yazar ve ardından bir artımlı güncellemenin ihtiyaç duyduğu üç şeyi sunar.
Bir kez build() çağrıldıktan sonra, yazıcı (src/Writer/PdfWriter.php) şunları saklar:
- çıktı arabelleğini; buna
getBuffer()aracılığıyla erişilebilir, böylece bir güncelleme mevcut baytların tam sonuna eklenebilir; - son çapraz başvuru bölümünün bayt uzaklığını; buna
getLastXrefOffset()aracılığıyla erişilir ve bu değer yeni bölümün/Prevdeğeri olur; - katalog sözlüğü girişlerini; bunlara
getCatalogEntries()aracılığıyla erişilir, böylece kataloğu yeniden yazması gereken bir güncelleme (örneğin bir imza başvurusu eklemek için) önceki anahtarların hiçbirini kaybetmez.
Sona eklenen bir revizyon, aynı ObjectRegistry üzerinden yeni nesne numaraları ayırır (veya değiştirdiği nesneler için mevcut olanları yeniden kullanır), böylece nesne numaralandırması revizyonlar arasında tutarlı kalır. Yeni çapraz başvuru bölümü yalnızca bu revizyonun dokunduğu nesneleri listeler. Yeni kuyruk, önceki kuyruğun girişlerini tekrarlar ve önceki bölüme geri işaret eden /Prev ekler. Okuyucunun izlediği zincir budur.
Bunun en belirgin önem kazandığı yer imzalamadır. NextPDF’in ByteRangeCalculator bileşeni (src/Security/Signature/ByteRangeCalculator.php), /ByteRange dizisini iki bölüm olarak hesaplar: imza değerinden önceki her şey ve ondan sonraki her şey — böylece imza, kendi baytları dışında tüm revizyonu kapsar. Sonraki bir düzenleme o baytların üzerine yazılmak yerine sona eklendiği için, bu aralık asla yerinden oynamaz.
- Write base revision Header, body, xref section, trailer — the original bytes.
- Sign A /ByteRange digest covers the whole revision except the signature value itself.
- Edit and save Changed objects + a new xref section are appended; originals are untouched.
- New trailer chains back The appended trailer carries /Prev = offset of the previous xref section.
- Verify The first signature still covers the same unchanged bytes; the chain shows what came after.
Kanıtların söylediği
“Kanıtların söylediği” başlıklı bölümYalnızca sona ekleme kuralı normatiftir. Spec: ISO 32000-2, §7.5.6 ISO 32000-2 §7.5.6 , bir PDF’nin içeriğinin tüm dosya yeniden yazılmadan artımlı olarak güncellenebileceğini; bunu yaparken değişikliklerin, özgün içerik olduğu gibi bırakılarak dosyanın sonuna eklenmesi gerektiğini (shall) belirtir. Evidence: Standard-backed
Aynı madde, işleyişi tanımlar. Bir artımlı güncellemeye ait çapraz başvuru bölümü yalnızca değiştirilen, yerine başka nesne konan veya silinen nesneler için girişler içerir. Silinen nesneler dosyada bırakılır, ancak çapraz başvuru girişleri aracılığıyla silinmiş olarak işaretlenir. Eklenen kuyruk mutlaka (shall) önceki çapraz başvuru bölümünün konumunu veren bir /Prev girişi içermelidir. Güncellemede, değişmiş bir nesneye ait giriş yeni kopyanın bayt uzaklığını taşır ve eski uzaklığı geçersiz kılar. Bir okuyucu, çapraz başvuru bilgilerini her nesnenin en güncel kopyasına erişilecek şekilde oluşturur.
İmzaya ilişkin sonuç doğrudan şurada belirtilir:
Spec: ISO 32000-2, §12.8.1 ISO 32000-2 §12.8.1 : bir bayt aralığı özeti,
dosyanın bir aralığı üzerinde — normalde tüm dosya üzerinde, imza değeri hariç —
(/Contents girişi) hesaplanır. Standart ardından şunu belirtir:
imzalanmış bir belge değiştirilir ve artımlı güncelleme ile kaydedilirse, özgün imzanın bayt
aralığına karşılık gelen veriler korunur; böylece
imza geçerliyse belgenin imzalama anındaki durumu yeniden
oluşturulabilir. Yalnızca sona ekleme bir ayrıntı değildir. İmza modelinin dayandığı
özelliğin ta kendisidir.
Uygulamalı örnek
“Uygulamalı örnek” başlıklı bölümİmzalanıp ardından düzenlenmiş bir PDF’nin yapısal görünümü. Özgün revizyon kendi %%EOF işaretiyle sona erer. İkinci revizyon bunun altına eklenir.
%PDF-2.0... original objects, including the signature dictionary ...xref0 8... entries for the original revision ...trailer<< /Size 8 /Root 1 0 R >>startxref920%%EOF <-- end of revision 1: the signed bytes stop here9 0 obj <-- revision 2, appended<< /Type /Annot /Subtype /Text /Contents (added after signing) >>endobjxref0 19 0 obj-entry...8 90000001740 00000 ntrailer<< /Size 10 /Root 1 0 R /Prev 920 >>startxref1980%%EOFBir doğrulayıcı son kuyruğu okur, /Prev 920 değerini görür ve böylece tüm zincire ulaşır. İmzayı, değişmemiş olan ilk %%EOF işaretine kadarki baytlara karşı doğrulayabilir. Ardından, 2. revizyonun bir ek açıklama eklediğini ayrıca raporlayabilir. Geçmiş, dosyanın içindedir. Üzerine yazılarak hiçbir şey gizlenmemiştir.
Yaygın yanlış anlama
“Yaygın yanlış anlama” başlıklı bölümTuzak şudur: “artımlı güncelleme, değişikliğin küçük olduğu, dolayısıyla zararsız olduğu anlamına gelir.” Sona ekleme, boyutla değil, baytların korunmasıyla ilgilidir. Bir artımlı güncelleme çok miktarda içerik ekleyebilir. Bir güncellemeyi artımlı yapan şey, zaten orada bulunan baytlara dokunmamasıdır. Buradan çıkan doğal sonuç da insanları yanıltır: imzalı bir PDF’yi sıfırdan yeniden yazarak “optimize eden” veya “doğrusallaştıran” bir araç, daha küçük ve daha temiz bir dosya ve bozuk bir imza üretir, çünkü imzalanan bayt aralığı artık yoktur. İmzalı bir PDF’yi kaydetmek ile onu yeniden kaydetmek aynı işlem değildir.
Sınırlar ve kapsam dışı durumlar
“Sınırlar ve kapsam dışı durumlar” başlıklı bölümYalnızca sona ekleme, baytları korur. Tek başına, eklenen değişikliklerin yetkili olup olmadığını size söylemez. İkinci bir revizyon meşru biçimde ikinci bir imza ekleyebilir veya ilk imzalayanın hiç amaçlamadığı bir içerik ekleyebilir. Hangisinin geçerli kabul edileceğine karar vermek, imza doğrulamasının ve değişiklik algılama ilkesinin (DocMDP) görevidir. Sona ekleme, o analizi mümkün kılan zemindir; analizin kendisi değildir.
Bu sayfa ayrıca, bir imzanın iki bayt aralığının nasıl hesaplanıp birleştirildiğini ya da eksiksiz bir doğrulamanın neleri denetlediğini kapsamaz. Bunlar ayrı konulardır. Buradaki güvence, uyumlu bir yazıcı tarafından yazılan ve güncellenen dosyalarla ilgilidir: daha önceki revizyonları zaten hatalı biçimlendirilmiş bir dosya, sonuna ekleme yapılarak iyi biçimlendirilmiş hale gelmez.
Mini SSS
“Mini SSS” başlıklı bölümBir PDF’nin kaç revizyona sahip olduğunu nasıl anlarım? %%EOF işaretlerini sayın ve son kuyruktan başlayarak /Prev zincirini izleyin. Ulaşılan her çapraz başvuru bölümü, kaydedilmiş bir revizyondur.
Bir nesneyi silmek, onu dosyadan kaldırır mı? Hayır. Bir artımlı güncelleme, nesneyi çapraz başvuru girişinde silinmiş olarak işaretler, ancak nesnenin baytları önceki revizyonlarda kalır. “Silindi”, “geçerli revizyon tarafından başvurulmuyor” anlamına gelir, “fiziksel olarak silindi” anlamına gelmez.
Bir artımlı güncelleme PDF sürümünü değiştirebilir mi? Evet, sona eklenen revizyonda katalogdaki /Version girişi ayarlanarak. Üstbilgi yazıldığı gibi kalır. Katalogdaki /Version, daha sonraki bir sürümü belirttiğinde önceliklidir.
İlgili belgeler
“İlgili belgeler” başlıklı bölüm- Bir PDF aslında nedir — nesne modeli ve güncellemenin genişlettiği tek çapraz başvuru bölümü.
- İmzalar bir PDF’nin içinde nasıl yer alır — artımlı güncellemelerin korumak için var olduğu bayt aralığı mekanizması.
- Bir imzayı doğru biçimde doğrulama — doğru bir doğrulamanın, bir dosyanın revizyon geçmişi boyunca neleri denetlediği.
Sözlük
“Sözlük” başlıklı bölüm- Artımlı güncelleme — bir değişikliği, mevcut baytları değiştirmeden, değişen nesneleri, yeni bir çapraz başvuru bölümünü ve yeni bir kuyruğu dosyanın sonuna ekleyerek kaydetme.
/Prev— önceki çapraz başvuru bölümünün bayt uzaklığını tutan kuyruk (veya çapraz başvuru akışı) girişi. Revizyonları geriye doğru bir zincire bağlar.- Revizyon — bir çapraz başvuru bölümü ve ona ait kuyruk tarafından temsil edilen dosya durumu. N çapraz başvuru bölümüne sahip bir dosyanın N revizyonu vardır.
/ByteRange— bir imza sözlüğünde, imza özetinin kapsadığı iki bayt bölümünü veren dizi (imza değerinin kendisi dışındaki her şey).- İmzalanan bayt aralığı — imza özetinin hesaplandığı tam baytlar. Artımlı güncellemeler, bu baytların asla taşınmaması veya üzerine yazılmaması için vardır.