PDFiumPas เขียนการเข้ารหัสแบบ ISO/TS 32003 ผ่าน SaveAsEncrypted: ตั้งค่า Revision เป็น erR7 แล้วสตริงและสตรีมทุกตัวจะถูกป้องกันด้วย AES-256 ในโหมด GCM ซึ่งเป็นไซเฟอร์แบบมีการยืนยันตัวตนที่ PDF 2.0 ได้รับมาในปี 2023 ตั้งค่า EnableIntegrityProtection เพิ่มเติมด้วย แล้วเอกสารจะพกโทเคน PDF MAC แบบเดี่ยวไปด้วย ซึ่ง ValidatePdfMac จะตรวจสอบในฝั่งการอ่าน
ทั้งสองอย่างนี้คือการป้องกันที่แตกต่างกันซึ่งคนมักเข้าใจปนกันอยู่เสมอ GCM ยืนยันตัวตนของค่าที่เข้ารหัสแต่ละค่า ส่วน MAC ยืนยันตัวตนของเอกสารทั้งฉบับ คุณต้องการทั้งสองอย่าง ด้วยเหตุผลที่ต่างกัน
GCM เพิ่มอะไรที่ CBC ไม่เคยให้ได้
การยืนยันตัวตนของไซเฟอร์เท็กซ์ AES-256 ในโหมด CBC ซึ่งเป็นสคีม AESV3 ใน ISO 32000-2 รักษาความลับของเนื้อหาไว้ได้ แต่ไม่ได้บอกอะไรเลยว่าข้อมูลนั้นมาถึงโดยไม่ถูกแก้ไขหรือไม่ CBC สามารถถูกดัดแปลงได้ในลักษณะที่เจาะจงและมีการศึกษาไว้ดีแล้ว: ผู้โจมตีที่สามารถพลิกบิตในไซเฟอร์เท็กซ์ได้จะสร้างการเปลี่ยนแปลงที่คาดเดาได้ในข้อความธรรมดาของบล็อกถัดไป และไม่มีอะไรในรูปแบบไฟล์สังเกตเห็นเลย
GCM ปิดช่องโหว่นั้น ค่าที่เข้ารหัสแต่ละค่าจะพกแท็กยืนยันตัวตนขนาด 16 ไบต์ ซีเรียลไลซ์ไว้แบบเต็มตามที่ ISO/TS 32003 กำหนด และการถอดรหัสจะล้มเหลวแทนที่จะคืนค่าข้อความธรรมดาที่ถูกแก้ไข เมื่อแท็กไม่ตรงกัน ในแง่ของ PDF สตริงหรือสตรีมที่ถูกแก้ไขในเอกสาร AESV4 จะเป็นข้อผิดพลาดร้ายแรง ณ จุดที่ใช้งาน ไม่ใช่ค่าประหลาดที่แพร่กระจายเข้าไปในแอปพลิเคชันของคุณ ดิกชันนารี Encrypt จะกำกับสิ่งนี้ด้วย /CFM /AESV4 และ V 6 / R 7 ควบคู่กับรายการส่วนขยายที่ประกาศ /ExtensionLevel 32003 และ /ExtensionRevision (:2023)
สามรีวิชัน สามระบบนิเวศ
TPdfEncryptionRevision มีให้เลือก erR5, erR6 และ erR7 และการเลือกใช้เป็นการตัดสินใจด้านความเข้ากันได้มากกว่าด้านการเข้ารหัส R5 คือสคีม AES-256 ดั้งเดิมที่เผยแพร่เป็นส่วนขยายของ PDF 1.7 ด้วยแฮชรหัสผ่าน SHA-256 ครั้งเดียว และเปิดได้กับแทบทุกอย่างในช่วงสิบห้าปีที่ผ่านมา R6 คือการอนุพันธ์คีย์แบบเข้มแข็งที่ถูกกำหนดมาตรฐานใน ISO 32000-2 ใช้โครงสร้าง SHA-256/384/512 แบบทำซ้ำของอัลกอริทึม 2.B และเป็นสิ่งที่เวิร์กโฟลว์ PDF 2.0 หรือ PDF/A-4 ในปัจจุบันคาดหวัง R7 คือ ISO/TS 32003 ที่ใช้การอนุพันธ์ 2.B แบบเดียวกันแต่ใช้ AES-GCM เป็นไซเฟอร์
การรองรับของโปรแกรมอ่านเรียงลำดับตามนี้พอดี และการรองรับ R7 ยังบางเบานอกเหนือจากโปรแกรมดูกระแสหลักในปัจจุบัน นี่คือการแลกเปลี่ยนแบบเดียวกับที่ควบคุมฟีเจอร์ PDF 2.0 ทุกตัว: ตัวเลือกใหม่ที่สุดคือวิศวกรรมที่ดีที่สุดแต่มีผู้ใช้แคบที่สุด ตัดสินใจตามว่าใครต้องเปิดไฟล์นั้น และถ้าคำตอบคือ “ระบบบันทึกที่ไม่มีใครอัปเดตตั้งแต่ปี 2019” คำตอบก็คือ R5 ไม่ว่านโยบายความปลอดภัยจะชอบอะไรก็ตาม
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; // standalone PDF MAC token
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
เหตุใดจึงต้องมี MAC ระดับเอกสารซ้อนบนไซเฟอร์ที่ยืนยันตัวตนแล้ว
เพราะแท็ก GCM ปกป้องตัวค่าเอง ไม่ใช่การจัดเรียงของค่าเหล่านั้น สตริงและสตรีมทุกตัวในเอกสาร AESV4 ถูกยืนยันตัวตนแยกกันเป็นรายตัว แต่ตารางอ้างอิงไขว้ การกำหนดหมายเลขอ็อบเจกต์ และ trailer เป็นโครงสร้าง ไม่ใช่เนื้อหาที่เข้ารหัส ผู้โจมตีไม่สามารถปลอมแปลงสตรีมได้ แต่ไม่มีอะไรในตัวไซเฟอร์เพียงอย่างเดียวที่หยุดพวกเขาจากการจัดเรียงใหม่ว่าเอกสารชี้ไปยังอ็อบเจกต์ใด หรือการต่อชิ้นส่วนอ็อบเจกต์จากรุ่นก่อนหน้าของไฟล์เดียวกันเข้าไป
โทเคน PDF MAC แบบเดี่ยวจัดการกับชั้นนั้น PDFiumPas อนุพันธ์มันจากคีย์การเข้ารหัสของไฟล์ด้วย /KDFSalt ขนาด 32 ไบต์เฉพาะที่บันทึกไว้ในดิกชันนารี Encrypt ดังนั้นการมีรหัสผ่านอยู่คือสิ่งที่ทำให้ผู้อ่านยืนยันโทเคนนั้นได้ ผลลัพธ์คือคำตอบเดียวสำหรับคำถามเดียว: เอกสารนี้ทั้งฉบับคือเอกสารที่ถูกเขียนขึ้นจริงหรือไม่
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); // no token in this file
pmvsInvalid: Quarantine(Mac.MessageText); // tampered or truncated
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
ค่าสถานะทั้งสี่ต้องการการตอบสนองที่ต่างกันสี่แบบ และการยุบรวมมันเป็นบูลีนเดียวจะทำให้เสียความแตกต่างที่สำคัญไป pmvsNotPresent หมายความว่าไฟล์นั้นไม่มีโทเคนอยู่เลย ซึ่งอธิบาย PDF ที่เข้ารหัสไว้เกือบทุกไฟล์ที่เขียนก่อนปี 2024 และไม่ใช่หลักฐานของอะไรเลย pmvsInvalid หมายความว่ามีโทเคนอยู่แต่ยืนยันไม่ผ่าน ซึ่งเป็นข้อค้นพบที่แท้จริงและควรหยุดการประมวลผล pmvsUnsupported หมายความว่ามีโทเคนอยู่ในรูปแบบที่บิลด์นี้ยังไม่รองรับ ซึ่งเป็นช่องว่างด้านความเข้ากันได้ ไม่ใช่การโจมตี การปฏิบัติต่อ “ไม่มีโทเคน” เหมือนกับ “ไม่ถูกต้อง” จะทำให้คุณกักกันคลังเอกสารเก่าทั้งหมดตั้งแต่วันแรก
สิ่งที่การเข้ารหัสยังคงทำไม่ได้
แฟล็กสิทธิ์การใช้งานยังคงเป็นสิ่งที่มันเคยเป็นมาตลอด คือคำขอต่อซอฟต์แวร์ที่ปฏิบัติตามข้อกำหนด ไม่ใช่การควบคุม บิต /P จากตาราง 22 ของ ISO 32000-1 ที่ห้ามการพิมพ์หรือการดึงข้อมูล จะถูกเคารพโดยโปรแกรมดูที่ปฏิบัติตามข้อกำหนดดี และถูกละเลยโดยสิ่งอื่นทั้งหมด และใครก็ตามที่ถือรหัสผ่านผู้ใช้ก็ถือเนื้อหาที่ถอดรหัสแล้วอยู่ในมืออยู่แล้ว การเข้ารหัสคือเขตแดน ส่วนสิทธิ์การใช้งานเป็นเพียงการบรรยายเจตนาภายในเขตแดนนั้น
มีรายละเอียดเชิงปฏิบัติการสองอย่างที่ควรวางแผนไว้ อย่างแรก การเข้ารหัสและการแก้ไขในภายหลังมีปฏิสัมพันธ์กัน: การต่อท้ายอัปเดตแบบเพิ่มขึ้นเข้าไปในเอกสารที่เข้ารหัสไว้มีกฎของตัวเอง อธิบายไว้ใน การอัปเดตแบบเพิ่มขึ้นบน PDF ที่เข้ารหัส และโทเคน MAC คือข้อความระดับเอกสารที่การต่อท้ายอย่างไม่ระวังจะทำให้เป็นโมฆะ อย่างที่สอง โครงสร้าง GCM ใช้ตัวนับ IV แบบกำหนดแน่นอน และ PDFiumPas จะเกิดข้อยกเว้นแทนที่จะใช้ค่าตัวนับซ้ำ ถ้าพื้นที่นั้นถูกใช้จนหมด เพราะการใช้ nonce ซ้ำใน GCM เป็นหายนะในแบบที่การวนกลับแบบเงียบ ๆ จะปิดบังไว้
การเลือกระหว่างสามรีวิชันในทางปฏิบัติ
เขียนไว้ให้ชัดว่าใครเป็นคนเปิดไฟล์ แล้วค่อยเลือก สำหรับการแจกจ่ายภายในที่ผู้อ่านทุกคนใช้โปรแกรมดูรุ่นปัจจุบันที่คุณควบคุมได้ R7 พร้อมการป้องกันความสมบูรณ์คือตัวเลือกที่แข็งแกร่งที่สุดที่มีอยู่ และไม่มีเหตุผลใดที่จะไม่ใช้มัน สำหรับเอกสารที่ออกนอกองค์กร R6 คือค่าเริ่มต้นที่ปกป้องได้ดี เพราะถูกกำหนดมาตรฐานใน ISO 32000-2 โดยตรง ไม่ใช่ในข้อกำหนดทางเทคนิคที่ซ้อนอยู่บนนั้น และการรองรับก็กว้างขวาง สำหรับคลังเก็บและผู้บริโภคระบบเก่า R5 คือตัวเลือกเดียวที่เปิดได้อย่างน่าเชื่อถือ และคุณควรบันทึกเหตุผลไว้ในที่เดียวกับที่คุณบันทึกนโยบายการเก็บรักษาข้อมูลที่เหลือ
ไม่ว่าคุณจะเลือกอะไร ให้ตรวจสอบผลลัพธ์แทนที่จะเชื่อว่าการเรียกฟังก์ชันสำเร็จ เปิดไฟล์ที่เข้ารหัสไว้อีกครั้ง ตรวจสอบ ValidatePdfMac และยืนยันว่าเวอร์ชันที่ประกาศไว้ตรงกับที่คุณคาดหวัง โดยใช้การตรวจสอบความสอดคล้องของเวอร์ชันใน ความสอดคล้องของเวอร์ชัน PDF ที่แน่นอน รายการตรวจสอบสำหรับการรับเอกสารที่ไม่น่าเชื่อถือแบบครอบคลุมกว่านี้อยู่ใน การตรวจสอบความเสี่ยงด้านความปลอดภัยของ PDF
PDFiumPas เป็นคอมโพเนนต์สำหรับ Delphi และ Lazarus ที่ห่อหุ้มเอนจิน PDFium ไว้ พร้อมสแตกการเข้ารหัส PDF 2.0 ที่เขียนขึ้นด้วย Pascal โดยเนทีฟทั้งหมด ทำให้ AES-256, GCM และโทเคน MAC ไม่ต้องพึ่ง DLL การเข้ารหัสภายนอกใด ๆ API ด้านการเข้ารหัสมีเอกสารอธิบายไว้ที่ หน้าคอมโพเนนต์ PDFium สำหรับ Delphi