고정 초기화 벡터(IV) 사용

Predictable Initialization Vector (IV)

설명

CBC, GCM 같은 블록 암호 모드는 암호화 시마다 고유하고 예측 불가능한 IV가 필요합니다. 동일 키로 동일 IV를 재사용하거나 0으로 채운 IV, 하드코딩된 문자열에서 파생된 IV를 쓰면 같은 평문이 같은 암호문 패턴으로 나타나거나(특히 CBC 첫 블록), GCM에서는 nonce 재사용으로 기밀성과 무결성이 동시에 붕괴됩니다. 공격자는 반복되는 패턴을 분석해 평문 관계를 추정하거나, GCM에서는 두 암호문의 XOR로 평문 관계를 드러내고 인증 태그를 위조하여 메시지를 변조할 수 있습니다.

잠재적 영향

  • 암호문 패턴 노출: 동일한 평문 블록이 반복적으로 같은 암호문 패턴으로 나타나 트래픽 상관관계와 내용 유추가 쉬워집니다.

  • 평문 관계 유출(GCM nonce 재사용): 같은 키·IV로 암호화된 두 암호문의 XOR로 평문들의 관계가 드러나 기밀성이 약화됩니다.

  • 무결성 붕괴 및 위조: AES-GCM에서 IV(Nonce) 재사용 시 인증이 깨져 공격자가 유효한 태그를 만들어 메시지를 위조할 수 있습니다.

  • 재전송/재식별 가능성: 동일 IV 사용으로 동일 요청·응답을 재식별하거나 재전송 공격이 쉬워질 수 있습니다.

해결 방법

  • 매 암호화 시점마다 새로운 IV 생성: SecureRandom.nextBytes(iv)로 예측 불가능한 IV를 생성합니다. GCM은 일반적으로 12바이트(96비트) 권장.

  • 하드코딩/정적 IV 금지: new byte[N], "constant".getBytes() 등 상수 기반 IV 사용을 금지합니다.

  • IV 재사용 방지 전략: 생성한 IV를 암호문과 함께 저장/전달하고, 같은 키로 재사용되지 않도록 관리합니다(예: DB에 마지막 IV 저장, 세션·메시지 단위로 고유 IV 생성).

  • 알고리즘 모드 점검: 가능하다면 nonce 오용 저항 모드(AES-GCM-SIV 등) 검토. 단, 기본 원칙은 여전히 고유 nonce 보장입니다.

  • 키/IV 길이 준수: 알고리즘이 요구하는 IV 길이(CBC 16바이트, GCM 12바이트 권장)를 맞춥니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: GCM에서 같은 키로 0으로 채운 고정 IV를 재사용하면 nonce 재사용이 발생합니다. 이는 기밀성 손상(평문 관계 노출)과 무결성 붕괴(태그 위조 가능)로 이어지며, CBC에서도 고정 IV는 반복 패턴 노출을 유발합니다.

  • 안전한 코드: SecureRandom으로 매번 새로운 12바이트 IV를 생성해 예측 불가능성과 유일성을 보장합니다. 또한 생성한 IV를 암호문과 함께 저장/전달하여 복호화 시 정확히 사용하되 재사용은 방지합니다.

참조

Last updated