콘텐츠로 이동

암호화 및 권한 플래그 문제 해결

이 문서는 엔진이 NextPDF\Exception\EncryptionExceptionNextPDF\Security\Exception\DecryptionFailedException을 통해 발생시키는 복호화 실패와 PDF 권한 플래그의 경계를 다룹니다.

가장 흔한 오해를 막기 위해 먼저 경계를 분명히 합니다. 암호화 사전의 PDF 권한 플래그는 작성자의 의도를 기록합니다. 이는 이 라이브러리가 강제하는 접근 제어 메커니즘이 아닙니다. 플래그를 무시하는 리더는 여전히 콘텐츠를 인쇄, 복사 또는 수정할 수 있습니다. 플래그는 강제 수단이 아니라 이를 준수하는 리더에 보내는 요청으로 취급하십시오.

항목: 암호화 작업이 실패합니다

섹션 제목: “항목: 암호화 작업이 실패합니다”
  • 증상. EncryptionException이 발생하고 메시지는 Encryption operation "<op>" failed using algorithm "<algorithm>" 형식입니다.
  • 유력한 원인. 암호화 연산을 실행할 수 없습니다. 일반적으로 OpenSSL 확장이 누락되었거나 잘못 구성된 경우, 키 자료가 유효하지 않은 경우, 또는 암호 경계에서 IV 크기가 유효하지 않은 경우에 발생합니다.
  • 증거 / 진단. getContext()algorithmoperation을 반환합니다. operation 값은 encrypt, decrypt 또는 key_derivation 중 하나이며, 어떤 단계가 실패했는지 알려줍니다.
  • 해결.
    1. OpenSSL PHP 확장이 설치되고 로드되었는지 확인하십시오.
    2. 실패하는 단계를 찾으려면 operation 필드를 읽으십시오.
    3. 실패 단계가 키 파생 단계인 key_derivation이면 비밀번호 또는 키 입력을 확인하십시오.
    4. 호출을 다시 실행하십시오.
  • 관련. 예외 참조.

항목: 구조적 이유로 복호화가 실패합니다

섹션 제목: “항목: 구조적 이유로 복호화가 실패합니다”
  • 증상. DecryptionFailedException이 발생하고 메시지는 Decryption failed for "<algorithm>": <reason> 형식입니다.
  • 유력한 원인. 변조와 무관한 이유로 암호문을 처리할 수 없습니다. 잘린 암호문, 누락된 IV, 또는 API 경계에서 제공된 잘못된 키 등이 원인일 수 있습니다. 평가할 자료가 충분하지 않았기 때문에 무결성 검사가 실행되지 않았습니다.
  • 증거 / 진단. getContext()algorithmreason을 반환합니다. DecryptionFailedException은 소스에서 TamperedDataException과 구별되는 것으로 문서화되어 있습니다. 이 예외는 변조 표시가 아니라 구성 또는 전송 오류입니다. 이 예외만으로 보안 사고로 취급하지 마십시오.
  • 해결.
    1. 구조적 결함을 파악하려면 reason을 확인하십시오. 예를 들어 ciphertext shorter than IV+tag입니다.
    2. 암호문이 잘림 없이 전송되었는지 확인하십시오.
    3. 경계에서 제공된 키가 문서를 암호화하는 데 사용된 키와 같은지 확인하십시오.
    4. 호출을 다시 실행하십시오.
  • 관련. 서명 및 타임스탬프 실패.

항목: “변조된 데이터” 예외가 발생합니다

섹션 제목: “항목: “변조된 데이터” 예외가 발생합니다”
  • 증상. NextPDF\Security\Exception\TamperedDataExceptionDecryptionFailedException 대신 발생합니다.
  • 유력한 원인. 무결성 검사가 실행되었으나 통과하지 못했습니다. 이는 구조적 복호화 실패와 구별됩니다. 무결성을 평가할 자료가 충분히 있었으나 무결성이 성립하지 않았습니다.
  • 증거 / 진단. 소스에서는 두 클래스를 대비합니다. DecryptionFailedException은 구조적 실패를 나타내며 보안 사고가 아닙니다. TamperedDataException은 인증된 콘텐츠가 검증되지 않았음을 나타냅니다.
  • 해결.
    1. 입력을 신뢰할 수 없는 것으로 취급하십시오. 복호화된 콘텐츠를 사용하지 마십시오.
    2. 신뢰할 수 있는 소스에서 문서를 다시 가져오십시오.
    3. 정상으로 알려진 소스에서도 실패가 계속되면 사고 보고를 위해 getContext()를 캡처하십시오.
  • 관련. 서명 및 타임스탬프 실패.

항목: 권한 플래그가 후속 작업을 막지 못합니다

섹션 제목: “항목: 권한 플래그가 후속 작업을 막지 못합니다”
  • 증상. 문서가 권한 플래그가 설정된 상태로 생성되었는데도(예: 복사 또는 인쇄 비허용) 리더가 여전히 콘텐츠를 복사하거나 인쇄합니다.
  • 유력한 원인. 이는 결함이 아니라 예상된 경계입니다. 코어 암호화 사전 빌더에 전달된 권한 정수는 이 라이브러리에서 강제 적용되지 않습니다. 플래그는 권고적 메타데이터입니다. 이를 준수하지 않는 리더는 NextPDF에 의해 차단되지 않습니다.
  • 증거 / 진단. src/Security/Encryption/EncryptionDictionaryBuilder.phpbuildDict(int $permissions, string $fileId)을 선언하며, 이 매개변수는 ignored; retained for forward compatibility로 문서화되어 있습니다. 이 메서드는 unset($permissions, $fileId)로 시작합니다. src/Inspect/PdfPermissions.php에서 노출하는 권한 플래그는 강제 레이어가 아니라 읽기 전용 검사 필드입니다.
  • 해결.
    1. 인쇄, 복사 또는 수정을 막기 위해 권한 플래그에 의존하지 마십시오. 이는 생성기 라이브러리가 강제할 수 없습니다.
    2. 접근을 제한해야 하는 경우 파일 자체의 배포를 통제하거나 PDF 외부에 접근 제어 시스템을 적용하십시오.
    3. 검사 클래스 PdfPermissions는 해당 작업이 방지된다고 주장하기 위해서가 아니라, 기존 문서가 선언한 플래그를 보고하는 용도로만 사용하십시오.
  • 관련. 서명 및 타임스탬프 실패.

항목: PDF/A에서 암호화가 거부됩니다

섹션 제목: “항목: PDF/A에서 암호화가 거부됩니다”
  • 증상. 빌드에서 PDF/A를 활성화하면서 동시에 암호화를 요청할 때 NextPDF\Security\Exception\IncompatiblePdfAModeException이 발생합니다.
  • 유력한 원인. PDF/A 프로필은 트레일러의 Encrypt 키를 금지합니다. 엔진은 어떤 호출 순서에서도 이 조합을 거부합니다.
  • 증거 / 진단. PDF/A 및 PDF/UA 항목을 참조하여 인용된 절, getContext() 필드 및 실패 경로 테스트를 확인하십시오.
  • 해결.
    1. 문서에 보관용 적합성이 필요한지, 암호화가 필요한지 결정하십시오.
    2. 필요하지 않은 속성에 대한 호출을 제거하십시오.
    3. 파이프라인을 다시 실행하십시오.
  • 관련. PDF/A 및 PDF/UA 검증.
  • DecryptionFailedExceptionTamperedDataException은 서로 다른 것을 의미합니다. 각각 구조적 실패와 무결성 실패를 뜻합니다. 메시지가 아니라 클래스를 기준으로 분기하십시오.
  • 코어 암호화 사전 빌더는 권한 정수를 무시합니다. 코어 패키지의 권한 강제에 의존하는 빌드는 오해에 기반한 것입니다.
  • PdfPermissions는 전체 검사 깊이에서 암호화된 문서에 대해서만 채워지며, 선언된 플래그를 반영합니다. 필드가 채워졌다고 해서 해당 작업이 방지되는 것은 아닙니다.

용어집: 권한 플래그 · 인증된 복호화