보안 및 개인정보 보호 백서(개요)5장

5장 암호화 및 키 관리

이 장에서는 FileBolt의 종단 간 암호화(E2EE)와 영지식 경계를 설명하고, cryptoVersion=v1의 매개변수, 인코딩 규칙, 실패 모드, 클라이언트 제약 조건을 명시합니다. 키는 클라이언트에서 생성되어 사용되며, 서버와 오브젝트 스토리지는 암호문 청크와 필요한 메타데이터만 처리합니다.

5.0 요약

  • 시스템은 복호화 키(CEK)를 수신, 저장 또는 기록해서는 안 됩니다(MUST NOT). CEK 정보는 URL 프래그먼트(# 이후 부분)로만 전달되며, 이 부분은 HTTP 요청에서 서버로 전송되지 않습니다.
  • 암호화에는 AES-128-GCM(AEAD)을 사용합니다. 파일마다 독립된 CEK(16바이트)를 사용합니다. 청크 크기는 고정되어 있습니다(예: 16MB).
  • v1 IV 구성: IV = noncePrefix(8B) || uint32_be(chunkIndex)(4B). AAD는 transferId, fileId, chunkIndex를 묶어 컨텍스트 바꿔치기와 재전송 공격을 방지합니다.
  • 서버 토큰은 암호문 접근만 제어하고 만료되며, 복호화 권한을 부여하지 않습니다.

5.1 전송 구간 암호화(TLS)

5.1.1 보안 목표

  • 업로드/다운로드/API 연결에서의 도청과 변조를 방지합니다.
  • 전송 중인 토큰과 암호문을 보호합니다.

5.1.2 보안 정책

  • 시스템은 모든 페이지와 API를 HTTPS로만 제공해야 합니다(MUST).
  • 시스템은 TLS 1.3을 우선 사용하고 필요에 따라 TLS 1.2를 지원하는 것이 좋습니다(SHOULD). 취약한 프로토콜과 암호 스위트는 반드시 비활성화해야 합니다(MUST).
  • 시스템은 적절한 max-age 값으로 HSTS를 활성화해야 합니다(MUST).

5.2 청크 암호화(AES-128-GCM)

5.2.1 설계 참고 사항

  • 파일은 고정 크기의 청크로 분할되며, 병렬 전송과 이어받기를 지원하기 위해 각 청크를 독립적으로 암호화합니다.
  • AEAD 인증이 무결성을 보호하며, 인증에 실패하면 반드시 실패 시 차단 방식으로 처리해야 합니다(MUST).

5.2.2 보안 정책

  • 파일마다 서로 다른 CEK(16바이트)를 사용해야 합니다(MUST).
  • IV는 (파일, chunkIndex) 조합마다 고유해야 합니다(MUST). v1은 noncePrefix + chunkIndex 인코딩을 사용합니다.
  • AAD에는 암호문을 해당 컨텍스트에 묶기 위해 (transferId, fileId, chunkIndex)를 포함해야 합니다(MUST).

5.3 영지식 링크 모델

5.3.1 핵심 제약 조건

  • CEK(또는 키 파생 재료)는 URL 프래그먼트로만 전달해야 하며, 쿼리 매개변수나 헤더에 포함해서는 안 됩니다(MUST NOT).
  • 서버는 프래그먼트를 기록해서는 안 되며(MUST NOT), 우발적인 수집을 막기 위해 로그를 정제해야 합니다(MUST).
  • 리퍼러 정책은 외부 링크 이동 시 프래그먼트가 유출되지 않도록 하는 것이 좋습니다(SHOULD). 9장을 참조하세요.

5.4 키 생성 및 처리

  • 키는 암호학적으로 안전한 난수 생성기(WebCrypto)로 생성해야 합니다(MUST).
  • 키는 메모리에만 보관하고 더 이상 필요하지 않으면 지우는 것이 좋습니다(SHOULD).
  • 클라이언트는 CEK를 서버에서 볼 수 있는 위치(예: 쿠키, 쿼리 매개변수)에 저장해서는 안 됩니다(MUST NOT).

5.5 인코딩 및 매개변수

  • cryptoVersion=v1은 알고리즘 구성과 IV/AAD 규칙을 식별합니다.
  • 매니페스트에는 필요한 공개 매개변수(청크 크기/개수, noncePrefix, fileId 매핑)를 포함해야 하지만(MUST), CEK는 포함해서는 안 됩니다(MUST NOT).

5.6 실패 모드(실패 시 차단)

  • 복호화에 실패하거나 AEAD 인증에 실패하면 클라이언트는 작업을 중단해야 하며(MUST), 일부만 복호화된 평문을 출력해서는 안 됩니다(MUST NOT).
  • 매개변수(transferId/fileId/chunkIndex)가 일치하지 않으면 클라이언트는 실패 시 차단 방식으로 처리해야 하며(MUST), 조치할 수 있는 오류를 보고하는 것이 좋습니다(SHOULD).

5.7 관련 클레임 ID