cryptography security encryption devops

고급 암호화 개념: CSPRNG에서 순방향 비밀성까지

CSPRNG, AEAD, 키 유도 함수 및 완전한 순방향 비밀성 원칙을 포함한 현대 암호화 빌딩 블록에 대한 탐구입니다.

고급 암호화 개념: CSPRNG에서 순방향 비밀성까지

데이터 침해가 도처에 널려 있고 국가 차원의 정교한 감시가 이루어지는 시대에, 암호화의 역할은 틈새 학문 분야에서 디지털 경제의 토대로 바뀌었습니다. 많은 개발자가 "해싱"이나 "대칭 암호화"와 같은 기본 개념에는 익숙하지만, 시스템의 실제 보안은 더 고급스럽고 미묘한 원시 함수(primitives)에 달려 있는 경우가 많습니다.

이 가이드에서는 TLS 1.3 및 Signal과 같은 현대적인 암호화 프로토콜을 가능하게 하는 핵심 구성 요소를 살펴보겠습니다. 무작위성 생성부터 오늘날의 비밀이 미래에 키가 노출되더라도 안전하게 유지된다는 보장에 이르기까지 다양한 내용을 다룹니다.


1. 무작위성의 기초: CSPRNG

모든 암호화 작업은 비밀에서 시작되고, 모든 비밀은 무작위성에서 시작됩니다. 하지만 근본적으로 결정론적인 기계인 컴퓨터의 세계에서 진정한 무작위성을 찾는 것은 놀랍도록 어렵습니다.

CSPRNG란 무엇인가요?

**암호학적으로 안전한 의사 난수 생성기(CSPRNG)**는 진정한 무작위 노이즈와 구별할 수 없는 숫자 시퀀스를 생성하도록 설계된 특수 알고리즘입니다. 표준 PRNG(JavaScript의 Math.random() 등)와 달리 CSPRNG는 다음 두 가지 중요한 요구 사항을 충족해야 합니다.

  1. 다음 비트 테스트(Next-Bit Test): 시퀀스의 처음 k 비트가 주어졌을 때, 무한한 계산 능력을 가진 공격자라도 50%보다 훨씬 높은 확률로 $(k+1)$번째 비트를 예측할 수 없어야 합니다.
  2. 상태 노출 시 내성(State Compromise Extensions): 생성기의 내부 상태가 노출되더라도 이전의 난수 출력을 재구성하거나(역추적 내성) 미래의 출력을 예측하는 것(예측 내성, 새로운 엔트로피가 추가된다는 가정하에)이 불가능해야 합니다.

엔트로피 소스

CSPRNG의 성능은 엔트로피 소스에 달려 있습니다. 현대적인 운영 체제는 키보드 타이밍, 마우스 움직임, 디스크 I/O 인터럽트, 열 노이즈와 같은 하드웨어 이벤트에서 "노이즈"를 수집하여 생성기의 시드(seed)로 사용합니다. Linux에서는 /dev/urandom이 이 역할을 담당합니다.


2. 연관 데이터 인증 암호화 (AEAD)

수십 년 동안 개발자들은 기밀성을 위해 암호화하고 무결성을 위해 MAC(HMAC 등)을 사용하도록 교육받았습니다. 이 "Encrypt-then-MAC" 방식은 안전하지만 구현 오류가 발생하기 쉽습니다.

AEAD의 등장

**AEAD(Authenticated Encryption with Associated Data)**는 단일 암호화 원시 함수에서 기밀성과 무결성을 모두 제공하여 이를 단순화합니다. AES-GCM 또는 ChaCha20-Poly1305와 같은 AEAD 모드를 사용하면 알고리즘은 다음을 생성합니다.

  1. 암호문(Ciphertext): 암호화된 데이터입니다.
  2. 인증 태그(Authentication Tag): 암호문이 변조되지 않았음을 증명하는 암호화 체크섬입니다.

연관 데이터 (AD)

"AD" 부분은 암호화되지 않은 데이터를 인증할 수 있게 해줍니다. 예를 들어, 네트워크 패킷에서 헤더(대상 IP 포함)는 라우터가 읽을 수 있도록 평문으로 남아야 하지만, 공격자가 대상을 변경하지 못하도록 인증되어야 합니다.


3. 키 유도 함수 (KDF)

암호화 키로 가공되지 않은 암호를 그대로 사용해서는 안 됩니다. 인간은 예측 가능한 암호를 선택하는 반면, 암호화 알고리즘은 엔트로피가 높고 균일하게 분포된 비트 문자열을 필요로 하기 때문입니다.

KDF는 어떤 역할을 하나요?

**키 유도 함수(KDF)**는 엔트로피 소스(암호 또는 키 교환에서 얻은 공유 비밀 등)를 가져와 거기에서 하나 이상의 암호학적으로 강력한 키를 "늘리거나" "유도"합니다.

현대적인 KDF 표준

  • PBKDF2: 무차별 대입 공격을 늦추기 위해 반복적인 해싱을 사용하는 오래된 표준입니다.
  • Argon2: 암호 해싱 대회(PHC)의 우승작으로, GPU 및 ASIC 기반 크래킹에 내성을 갖도록 설계되었습니다.
  • HKDF (HMAC 기반 KDF): TLS 1.3과 같은 프로토콜에서 널리 사용되며, 단일 공유 비밀에서 여러 독립적인 키(예: 암호화 키 및 인증 키)를 유도합니다.

4. 임시 키 교환 및 순방향 비밀성

현대 암호학에서 가장 강력한 개념 중 하나는 **완전한 순방향 비밀성(Perfect Forward Secrecy, PFS)**입니다.

정적 키의 문제점

이전 버전의 SSL에서는 서버가 정적인 RSA 개인 키를 사용하여 세션 키를 교환했습니다. 만약 공격자가 몇 년 동안 암호화된 모든 트래픽을 기록하고 나중에 서버의 개인 키를 훔치는 데 성공한다면, 그들이 수집한 모든 과거 트래픽을 해독할 수 있게 됩니다.

해결책: 임시 키 교환

현대적인 프로토콜은 임시 디피-헬먼(DHE) 또는 **타원 곡선 디피-헬먼(ECDHE)**을 사용합니다.

  • **임시(Ephemeral)**는 키가 일시적임을 의미합니다. 모든 세션에 대해 새롭고 고유한 키 쌍이 생성됩니다.
  • 세션이 종료되면 키는 메모리에서 삭제됩니다.

순방향 비밀성 달성

서버의 장기 신원 키는 세션 키를 암호화하는 대신 교환에 서명하는 데(서버의 신원을 증명하기 위해) 사용되므로, 장기 키가 노출되더라도 공격자가 과거 트래픽을 해독하는 데 도움이 되지 않습니다. 이것이 프라이버시를 위한 골드 표준입니다.


5. 요약: 보안 시스템 구축

현대적이고 안전한 애플리케이션을 구축하려면 다음과 같은 아키텍처 패턴을 따라야 합니다.

  1. 시스템에서 제공하는 CSPRNG를 사용하여 비밀을 생성합니다 (예: 브라우저의 crypto.getRandomValues() 또는 Node.js의 crypto.randomBytes()).
  2. Argon2 또는 Scrypt를 사용하여 암호를 저장합니다.
  3. AES-256-GCM과 같은 AEAD 모드를 사용하여 미사용 데이터를 보호합니다.
  4. 순방향 비밀성을 위해 ECDHE를 사용하는 TLS 1.3으로 전송 중인 데이터를 보호합니다.
  5. 서로 다른 목적으로 동일한 마스터 키를 재사용하는 대신 HKDF를 사용하여 서브 키를 유도합니다.

이러한 고급 개념을 이해하면 단순히 보안의 "체크박스를 채우는" 수준을 넘어, 현재의 위협과 미래의 취약성 모두에 탄력적인 시스템을 구축할 수 있습니다.