Teknik Makale

PDFium: Delphi'de ISO/TS 32003 AES-GCM Şifreleme

PDFiumPas, SaveAsEncrypted üzerinden ISO/TS 32003 şifrelemesi yazar: RevisionerR7 olarak ayarlayın, her dize ve akış, PDF 2.0'ın 2023'te kazandığı kimliği doğrulanan şifre olan GCM modunda AES-256 ile korunsun. EnableIntegrityProtection'ı da ayarlayın, belge ayrıca bağımsız bir PDF MAC jetonu taşısın; okuma tarafında bunu ValidatePdfMac kontrol eder

Bunlar, insanların rutin olarak karıştırdığı iki farklı korumadır. GCM her şifreli değeri doğrular. MAC ise belgenin tamamını doğrular. İkisine de farklı nedenlerle ihtiyacınız var

GCM, CBC'nin hiç sağlamadığı neyi ekliyor?

Şifreli metnin kimlik doğrulamasını. ISO 32000-2'deki AESV3 şeması olan CBC modunda AES-256, içeriği gizli tutar ve değiştirilmeden gelip gelmediği hakkında hiçbir şey söylemez. CBC, belirli, iyi incelenmiş şekillerde dövülebilirdir: şifreli metinde bit çevirebilen bir saldırgan, sonraki bloğun düz metninde öngörülebilir değişiklikler üretir ve biçimdeki hiçbir şey bunu fark etmez

GCM bunu kapatır. Her şifreli değer, ISO/TS 32003'ün gerektirdiği şekilde tam olarak serileştirilmiş 16 baytlık bir kimlik doğrulama etiketi taşır ve etiket eşleşmediğinde çözme, değiştirilmiş düz metin döndürmek yerine başarısız olur. PDF terimleriyle, bir AESV4 belgesindeki kurcalanmış bir dize ya da akış, uygulamanıza yayılan garip bir değer değil, kullanım noktasında sert bir hatadır. Encrypt sözlüğü bunu /CFM /AESV4 ve V 6 / R 7 ile, /ExtensionLevel 32003 ve /ExtensionRevision (:2023) bildiren bir uzantılar girdisinin yanında işaretler

Üç revizyon, üç ekosistem

TPdfEncryptionRevision, erR5, erR6 ve erR7 sunar ve seçim, kriptografik olmaktan çok bir uyumluluk kararıdır. R5, PDF 1.7 uzantısı olarak yayımlanan, tek bir SHA-256 parola özetine sahip orijinal AES-256 şemasıdır ve son on beş yılın hemen hemen her şeyinde açılır. R6, ISO 32000-2'de standartlaştırılan, algoritma 2.B'nin yinelemeli SHA-256/384/512 yapısını kullanan sertleştirilmiş anahtar türetmedir ve güncel bir PDF 2.0 ya da PDF/A-4 iş akışının beklediği şeydir. R7 ise ISO/TS 32003'tür; aynı 2.B türetmeyi şifre olarak AES-GCM ile kullanır

Okuyucu desteği tam olarak bu sırayla ilerler ve R7 desteği güncel ana akım görüntüleyicilerin dışında hâlâ zayıftır. Bu, herhangi bir PDF 2.0 özelliğini yöneten aynı ödünleşimdir: en yeni seçenek en iyi mühendisliktir ve en dar kitleye sahiptir. Kimin dosyayı açması gerektiğine göre karar verin ve o cevap "2019'dan beri kimsenin güncellemediği bir kayıt sistemi" ise, cevap güvenlik politikasının tercih ettiği ne olursa olsun R5'tir

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;   // bağımsız PDF MAC jetonu

    if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
      raise Exception.Create('Encrypted save failed');
  finally
    Pdf.Free;
  end;
end;

Kimliği doğrulanan bir şifrenin üzerine neden bir belge MAC'i?

Çünkü GCM etiketleri değerleri korur, değerlerin düzenini değil. Bir AESV4 belgesindeki her dize ve akış ayrı ayrı kimliği doğrulanmıştır, ama çapraz referans tablosu, nesne numaralandırması ve sonek yapıdır, şifreli içerik değil. Bir saldırgan bir akışı sahtelendiremez, ama şifrenin kendisinde hiçbir şey onların belgenin hangi nesnelere işaret ettiğini yeniden düzenlemesini ya da aynı dosyanın önceki bir revizyonundan nesneleri birleştirmesini engellemez

Bağımsız PDF MAC jetonu o katmanı ele alır. PDFiumPas onu, Encrypt sözlüğüne kaydedilen özel 32 baytlık bir /KDFSalt ile dosya şifreleme anahtarından türetir; bu yüzden parolaya sahip olmak, bir okuyucunun jetonu doğrulamasını sağlayan şeydir. Sonuç, tek bir soruya tek bir cevaptır: bu belge, bir bütün olarak, yazılan belge mi

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);       // bu dosyada jeton yok
      pmvsInvalid:     Quarantine(Mac.MessageText);   // kurcalanmış ya da kesilmiş
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Dört durum değeri dört farklı yanıt gerektirir ve bunları bir mantıksal değere sıkıştırmak önemli olan ayrımı kaybeder. pmvsNotPresent, dosyanın basitçe hiç jetonu olmadığı anlamına gelir; bu, 2024'ten önce yazılmış hemen hemen her şifreli PDF'i tanımlar ve hiçbir şeyin kanıtı değildir. pmvsInvalid, bir jetonun mevcut olduğu ve doğrulanmadığı anlamına gelir; bu gerçek bir bulgudur ve işlemeyi durdurmalıdır. pmvsUnsupported, jetonun bu derlemenin uygulamadığı bir biçimde var olduğu anlamına gelir; bu bir uyumluluk boşluğudur, bir saldırı değil. "Mevcut değil"i "geçersiz" olarak ele almak, tüm eski arşivinizi ilk günde karantinaya alırdı

Şifreleme hâlâ neyi yapmıyor

İzin bayrakları hep oldukları şeydir: uyumlu yazılıma bir istek, bir denetim değil. ISO 32000-1 Tablo 22'deki yazdırmayı ya da çıkarmayı yasaklayan /P bitleri, iyi davranan görüntüleyiciler tarafından onurlandırılır ve geri kalan her şey tarafından yok sayılır; kullanıcı parolasına sahip olan herkes zaten çözülmüş içeriğe de sahiptir. Şifreleme sınırdır; izinler onun içindeki niyeti tanımlar

Planlamaya değer iki operasyonel ayrıntı var. Birincisi, şifreleme ve sonraki değişiklik birbirine karışır: şifrelenmiş bir belgeye artımlı bir güncelleme eklemenin kendi kuralları vardır ve bunlar şifreli PDF'lerde artımlı güncellemelerde ele alınmıştır; bir MAC jetonu, dikkatsiz bir eklemenin geçersiz kılacağı belge düzeyinde bir ifadedir. İkincisi, GCM yapısı belirlenimci bir IV sayacı kullanır ve PDFiumPas, o alan tükense bile bir sayaç değerini yeniden kullanmak yerine hata verir, çünkü GCM'de nonce yeniden kullanımı, sessiz bir devrin gizleyeceği türden felakettir

Üç revizyon arasında pratikte seçim yapmak

Dosyayı kimin açtığını yazın, sonra seçin. Her okuyucunun sizin kontrolünüzdeki güncel bir görüntüleyici olduğu dahili dağıtım için, bütünlük korumalı R7 mevcut en güçlü seçenektir ve onu kullanmamak için hiçbir neden yoktur. Kurum dışına çıkan belgeler için R6 savunulabilir varsayılandır: onun üzerine kurulu bir teknik özellik yerine ISO 32000-2'de standartlaştırılmıştır ve desteği geniştir. Arşivler ve eski tüketiciler için R5, güvenilir şekilde açılan tek seçenektir ve bunun nedenini saklama politikanızın geri kalanını kaydettiğiniz yerde kaydetmelisiniz

Hangisini seçerseniz seçin, çağrının başarılı olduğuna güvenmek yerine çıktıyı doğrulayın. Şifreli dosyayı yeniden açın, ValidatePdfMac'i kontrol edin ve bildirilen sürümün beklediğiniz şey olduğunu, tam PDF sürüm uyumluluğundaki sürüm uyumluluk kontrolleriyle doğrulayın. Güvenilmeyen belgeler için daha geniş bir alım kontrol listesi PDF güvenlik risklerini denetlemede bulunur

PDFiumPas, PDF 2.0 şifreleme yığını Pascal içinde yerel olarak uygulanmış, PDFium motoru etrafında bir Delphi ve Lazarus bileşenidir; bu yüzden AES-256, GCM ve MAC jetonu harici bir kripto DLL'i gerektirmez. Şifreleme API'si PDFium Delphi bileşeni sayfasında belgelenmiştir