THotPDF.ValidatePDFMACChain Method
從最舊的交叉參考區段到作用中修訂,驗證每一個 PDF MAC 修訂,並傳回各修訂專屬的完整性診斷
宣告
function ValidatePDFMACChain(const FileName: TFileName; const Password: AnsiString; out ValidationInfo: THPDFPDFMACChainValidationInfo): boolean; overload;
function ValidatePDFMACChain(const FileName: TFileName; const Password: AnsiString; const Options: THPDFPDFMACOptions; out ValidationInfo: THPDFPDFMACChainValidationInfo): boolean; overload;
驗證模型
- 修訂索引以 0 起算,按原始修訂到作用中修訂的順序排列
- 第一個含有
AuthCode的修訂成為鏈的錨點,其後每個修訂都必須含有有效的 PDF MAC - 每個 MAC 都以剛好結束於該修訂對應
startxref與%%EOF邊界的位元組字首來驗證 - 即使較新的作用中修訂 MAC 仍然有效,驗證器也會拒絕被置換的歷史 MAC
KDFSalt在錨點之後必須保持穩定,摘要強度在已驗證的 MAC 修訂之間也不得下降- 每個修訂都會檢查已驗證的
/P與/Perms值,包括 PDF MAC 必需權限位元
結果記錄
THPDFPDFMACChainValidationInfo 會回報 RevisionCount、FirstMACRevisionIndex、ValidatedRevisionCount、FailureRevisionIndex、FailureXRefOffset、權限涵蓋、salt 穩定性、摘要單調性,以及每個修訂一筆的 THPDFPDFMACRevisionValidation 記錄
THPDFPDFMACChainFailure 區分修訂邊界錯誤、缺少 MAC、無效或被置換的 MAC、KDFSalt 變更、摘要強度下降與已驗證權限降級
實作只列舉一次修訂鏈並更新單一累計交叉參考狀態,避免暫存 PDF 複本與重複的物件索引,同時對每個受保護修訂保留獨立的密碼學驗證
Delphi 範例
var
ChainInfo: THPDFPDFMACChainValidationInfo;
begin
if not PDF.ValidatePDFMACChain('authenticated.pdf', 'user-password',
ChainInfo) then
raise Exception.CreateFmt('Revision %d at xref %d failed: %s',
[ChainInfo.FailureRevisionIndex, ChainInfo.FailureXRefOffset,
ChainInfo.Message]);
end;
預檢
CreatePreflightReport 會以 PDFMACRevisionChain 公開同樣的結果,讓自動化流程能區分目前生效修訂版的有效性,與整條修訂版鏈的有效性
若只需檢查作用中修訂,請參閱 ValidatePDFMAC,或是參考 PDF MAC 演算法靈活性與原則設定檔 來了解摘要原則語意