THotPDF.ValidatePDFMACChain Method
가장 오래된 cross-reference section부터 활성 revision까지 모든 PDF MAC revision을 검증하고 revision별 무결성 진단을 돌려줍니다
선언
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;
검증 모델
- revision 인덱스는 0부터 세며 원본 revision부터 활성 revision 순으로 정렬됩니다
AuthCode를 담은 첫 revision이 체인 앵커가 되고, 그 뒤의 모든 revision은 유효한 PDF MAC을 가져야 합니다- 각 MAC은 해당 revision의
startxref와%%EOF경계로 끝나는 정확한 byte prefix와 대조해 검증합니다 - validator는 더 새 활성 revision의 MAC이 유효하게 남아 있어도 교체된 과거 MAC을 거부합니다
KDFSalt는 앵커 이후로 그대로 유지되어야 하고, 검증되는 MAC revision 사이에서 digest 강도가 약해져서는 안 됩니다- 인증된
/P와/Perms값은 revision마다 검사하며, PDF MAC 요구 permission bit도 포함됩니다
결과 레코드
THPDFPDFMACChainValidationInfo는 RevisionCount, FirstMACRevisionIndex, ValidatedRevisionCount, FailureRevisionIndex, FailureXRefOffset, permission 적용 범위, salt 안정성, digest 단조성, revision별 THPDFPDFMACRevisionValidation 레코드를 보고합니다
THPDFPDFMACChainFailure는 revision 경계 error, 누락된 MAC, invalid 또는 교체된 MAC, 바뀐 KDFSalt, digest 다운그레이드, 인증 permission 다운그레이드를 구분합니다
구현은 revision 체인을 한 번만 순회하면서 누적 cross-reference 상태 하나를 갱신하고, 보호되는 각 revision의 독립적인 암호학적 검증은 그대로 유지하면서 임시 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;
Preflight
CreatePreflightReport는 같은 결과를 PDFMACRevisionChain으로 노출하므로, 자동화 워크플로우가 활성 revision의 유효성과 전체 revision 체인의 유효성을 구분할 수 있습니다
활성 revision만 검사하면 되는 경우는 ValidatePDFMAC를, digest policy 의미 체계는 PDF MAC 알고리즘 민첩성 및 정책 프로필을 참고하세요