제7장 보안과 암호화
7.1 보안 모델
DTP 구현은 종단 간 암호화를 제공해야 한다. 보안 모델은 다음 불변 조건을 충족해야 한다:
- 대상 iFay 인스턴스만이 수신한 Payload를 복호화할 수 있어야 한다.
- FayGer 런타임 환경은 어떠한 경우에도 평문 데이터에 접근해서는 안 된다.
- 중간 네트워크 노드는 Payload 평문을 읽어서는 안 된다.
- DTP 구현은 암호화 키를 자체적으로 관리해서는 안 된다.
7.2 암호화 범위
암호화 범위는 LogicalFrame의 Payload로 엄격하게 한정되어야 한다.
7.2.1 반드시 암호화해야 할 내용
다음 데이터는 암호화해야 한다:
- LogicalFrame의
payload필드(즉, Fragment의data필드 그리고 (Frame 형식으로 운반되는 경우) RequestFrame, ResponseFrame, ControlFrame의 내용).
7.2.2 암호화해서는 안 되는 내용
다음 데이터는 암호화해서는 안 되며, 평문으로 전송해야 한다:
- LogicalFrame의
header(protocolVersion,frameType,fragmentId,agreementId,originTimestamp,dagDependencies,encryptionMetadata,sequenceNumber를 포함).
암호화 메타데이터 자체는 암호화해서는 안 되며, 이는 수신측이 복호화 전에 복호화 매개변수를 결정할 수 있도록 한다.
7.3 키 관리
7.3.1 키 출처
DTP 구현은 CAP에서 사전 협상한 키를 사용해야 한다. 구체적 요구사항:
- CAP는 연결 수립 단계에서 신원 검증과 키 교환을 완료해야 한다.
- DTP 구현은 CAP가 제공한
sessionKey를 사용하여 Payload 암호화/복호화를 수행해야 한다. - DTP 구현은 암호화 키를 자체적으로 생성, 협상 또는 교환해서는 안 된다.
7.3.2 CAPContext 인터페이스
DTP 구현은 다음 인터페이스를 통해 CAP가 제공하는 컨텍스트를 받아야 한다:
interface CAPContext {
identity: string;
sessionKey: Uint8Array;
verified: boolean;
}
| 필드 | 규범적 요구사항 |
|---|---|
identity | 상대측 신원 식별자여야 한다 |
sessionKey | CAP가 협상한 세션 키의 바이트 시퀀스여야 한다 |
verified | CAP 검증 상태를 반영해야 한다 |
7.3.3 CAP 전제 조건
DTP 구현은 데이터 전송 시작 전에 CAPContext를 검증해야 한다:
verified === false이면 데이터 프레임 전송을 거부하고KEY_NOT_READY오류(2002)를 반환해야 한다.sessionKey가 비어 있거나 길이가 유효하지 않으면KEY_NOT_READY오류를 반환해야 한다.- 협상 프레임(Request_Frame, Response_Frame)의 전송도 동일하게 이 전제 조건의 제약을 받는다.
7.4 암호화 메타데이터
각 LogicalFrame의 프레임 헤더는 EncryptionMetadata를 포함해야 한다:
interface EncryptionMetadata {
algorithm: string;
keyVersion: number;
}
7.4.1 알고리즘 식별자
algorithm 필드는 암호화 알고리즘의 식별 문자열이어야 한다. 다음 표준화 명명 중 하나를 사용해야 한다(권장):
| 식별자 | 알고리즘 | 상태 |
|---|---|---|
"AES-256-GCM" | AES-256 in Galois/Counter Mode | 권장 |
"ChaCha20-Poly1305" | ChaCha20 with Poly1305 | 권장 |
"AES-128-GCM" | AES-128 in Galois/Counter Mode | 사용 가능 |
구현은 최소한 AES-256-GCM과 ChaCha20-Poly1305 중 하나를 지원해야 한다. 상호 운용성을 강화하기 위해 두 가지를 모두 지원하는 것을 권장한다.
구현은 다음을 사용해서는 안 된다:
- ECB 모드(안전하지 않음)
- 인증이 없는 암호화 모드(MAC 없는 CBC, CTR)
- 알려진 약점이 있는 알고리즘(DES, 3DES, RC4)
7.4.2 키 버전 번호
keyVersion은 음이 아닌 정수여야 하며, 키 로테이션을 지원하기 위해 사용된다:
- CAP가 키 로테이션을 트리거하면 새 키의
keyVersion은 이전 버전보다 엄격하게 커야 한다. - 수신측은
keyVersion을 사용하여 대응하는 복호화 키를 선택해야 한다. - 구현은 진행 중(in-flight)인 Fragment를 지원하기 위해 적어도 하나의 이전 키 버전을 유지해야 한다(권장).
7.5 암호화 왕복 일관성
구현은 다음 암호화 왕복 일관성 속성을 충족해야 한다:
- 올바른 키(송신측이 사용한 키와 일치)로 암호화 후 복호화하면 원본 Payload와 바이트 수준으로 동일한 출력이 생성되어야 한다.
- 잘못된 키로 복호화하면 실패해야 하며,
DECRYPTION_FAILED오류(2001)를 반환해야 한다. - 복호화 실패 시 구현은 부분적으로 복호화된 결과나 손상된 데이터를 반환해서는 안 된다.
7.6 단말 측 복호화
단말이 수신측인 경우(데이터 주입 시나리오):
- DTP_Slave는 단말이 CAP 연결 수립 단계에서 제출한 키를 사용하여 복호화해야 한다.
- 해당 키는 단말이 CAP에서 제출한 비공개키/세션 키와 대응되어야 한다.
- 단말은 다른 어떠한 키의 복호화 결과도 받아들여서는 안 된다.
7.7 복호화 실패 처리
구현은 다음 규칙에 따라 복호화 실패를 처리해야 한다:
- 단일 복호화 실패: 프레임을 폐기하고
DECRYPTION_FAILED오류 알림(2001)을 전송한다. - 연속 복호화 실패가 임곗값(구현 정의, 권장 3회)을 초과: a. CAP 키 재교환을 트리거해야 한다(권장). b. 상위 애플리케이션에 보안 예외를 통지해야 한다(권장).
- 구현은 여러 차례 복호화 실패 후에도 동일 프레임에 대해 무한히 재시도해서는 안 된다.
7.8 보안 위협 방어
구현은 프로토콜 설계를 통해 다음 위협으로부터 방어해야 한다:
| 위협 | 방어 메커니즘 |
|---|---|
| 중간자 도청 | Payload 종단 간 암호화 |
| FayGer 엿보기 | Payload 암호화, FayGer는 암호문만 볼 수 있음 |
| 키 유출 | 키 버전 번호 메커니즘으로 키 로테이션 지원 |
| 신원 위조 | CAP 검증에 위임 |
| 재전송 공격 | 시퀀스 번호 단조 증가 + 세션 바인딩 |
| 프레임 변조 | 인증 암호화(AEAD) 알고리즘 사용 |
7.9 재전송 보호
구현은 다음 메커니즘을 통해 재전송 공격으로부터 방어해야 한다:
- 시퀀스 번호 단조 증가: 수신측은 이미 확인된 최고 시퀀스 번호 이하의 프레임을 거부해야 한다(재개 시나리오 제외).
- 세션 바인딩: 시퀀스 번호 공간은 구체적인 세션과 바인딩되어야 한다. 새 세션은 시퀀스 번호를 재설정해야 한다.
- AEAD 인증: 암호화 알고리즘은 메시지 인증을 제공해야 한다(GCM, Poly1305 등).
7.10 메타데이터 프라이버시
구현은 다음에 유의해야 한다: 프레임 헤더의 평문 메타데이터는 다음 정보를 유출할 수 있다:
- 통신 상대 신원(
agreementId연결을 통해) - 통신 시간 패턴(
originTimestamp와sequenceNumber를 통해) - 데이터 전송 빈도(프레임 간 시간차를 통해)
구현은 다음 방식으로 메타데이터 프라이버시를 강화할 수 있다:
- 트래픽 패딩 활성화(구현 정의).
- 난독화 전송 계층 사용(예: TLS 1.3 기반의 ECH).
다만 본 사양은 구현이 메타데이터 프라이버시 보호를 제공하도록 요구하지 않는다.
