본문으로 건너뛰기
HexaTransfer
블로그로 돌아가기
암호화 및 보안

암호화 키의 작동 원리: 파일 보안의 기초

암호화 키의 작동 원리를 쉬운 말로 이해하세요. 키 생성, 교환, 관리가 안전한 파일 공유를 가능하게 하는 방법.

암호화 키는 데이터를 잠그고 여는 무작위 비트 문자열입니다. 현대 파일 전송에서 이것은 대개 256비트 AES 키, 즉 암호학적으로 안전한 난수 생성기(CSPRNG)가 생성한 32바이트 무작위 데이터를 의미합니다. 10GB 동영상을 암호문으로 변환하는 동일한 알고리즘이 정확히 같은 키가 주어졌을 때만 이를 복원할 수 있습니다. 키 보안이 암호화의 사활을 결정합니다. 완벽한 AES-256 암호라도 키가 약하거나 예측 가능하거나 노출되면 아무 소용이 없습니다. 이 글은 HexaTransfer, Tresorit, Proton Drive 같은 실제 서비스에서 키가 어떻게 생성되고, 공유되고, 저장되고, 폐기되는지를 설명합니다.

키는 그저 무작위 숫자입니다

256비트 키는 32바이트입니다. 브라우저에서 생성하면 이런 모습입니다.

const key = crypto.getRandomValues(new Uint8Array(32));
// Uint8Array(32) [183, 45, 201, 77, ...]

이것을 "키"로 만드는 것은 알고리즘이 이를 사용하는 방식입니다. AES-256-GCM은 256비트 키를 받아 키 스케줄을 통해 15개의 라운드 키로 확장하고, 이를 사용해 14라운드에 걸쳐 128비트 블록을 뒤섞습니다. 수학은 비트가 어디서 왔는지 신경 쓰지 않습니다. 단지 비밀이고 예측 불가능해야 할 뿐입니다.

"예측 불가능"이 더 어려운 절반입니다. 공격자가 RNG의 상태를 추측할 수 있다면 키를 재생성할 수 있습니다. 2006년 Debian OpenSSL 버그는 키 엔트로피를 2년간 15비트로 줄였습니다. 무작위성이 실패할 때 어떤 일이 생기는지 보여주는 교과서적 사례입니다.

암호학적으로 안전한 난수성

브라우저는 crypto.getRandomValues()를 제공하며 이는 OS의 CSPRNG에서 가져옵니다. Linux의 /dev/urandom, Windows의 BCryptGenRandom, macOS의 SecRandomCopyBytes가 그것입니다. 이들은 인터럽트 타이밍, 디스크 탐색 시간, Intel의 RDRAND 같은 하드웨어 RNG 칩 등 여러 엔트로피 소스를 혼합합니다.

키에는 Math.random()을 사용하지 마세요. 이것은 예측 가능한 Mersenne Twister이며 몇 번의 출력만으로 상태를 복구할 수 있습니다.

서버 측에서는 Node.js의 crypto.randomBytes()와 Python의 secrets.token_bytes()가 OS CSPRNG을 래핑하며 안전합니다. NIST SP 800-90A와 SP 800-90B가 CSPRNG 요구사항을 정의합니다. Linux 커널 5.17+는 이를 충족하는 BLAKE2s 기반 설계를 사용합니다.

대칭 키: 하나의 키, 두 방향

AES 같은 대칭 알고리즘은 암호화와 복호화에 같은 키를 사용합니다. 키 크기 옵션은 다음과 같습니다.

  • 128비트 — 2^128가지 가능한 값, 대부분의 목적에 안전. NSA CNSSP-15의 비밀 등급 승인.
  • 192비트 — 드물고 일부 정부 맥락에서 사용됩니다.
  • 256비트 — 2^256가지 값, 최고 비밀 등급 승인. 파일 전송 서비스의 현재 기본값.

키 크기를 두 배로 늘려도 브루트 포스 난이도가 두 배 되지 않습니다. 제곱으로 어려워집니다. 2^128은 이미 도달 불가능한 수준입니다(지구의 모든 컴퓨터로 우주의 나이 곱하기 100억 배). 256비트는 Grover 알고리즘이 대칭 키 강도를 사실상 절반으로 줄이는 양자 컴퓨터에 대한 보험입니다.

대칭 키의 어려운 문제: 누군가 가로채지 않고 두 당사자 모두에게 같은 키를 전달하는 것입니다.

비대칭 키: 키 쌍의 묘수

공개 키 암호화는 키 배포 문제를 해결합니다. 각 당사자는 수학적으로 연결된 키 쌍을 생성합니다. 공개 키(공개적으로 공유)와 개인 키(비밀 보관)입니다. 공개 키로 암호화된 것은 개인 키로만 복호화할 수 있습니다.

일반적인 비대칭 키 유형입니다.

  • RSA-2048 — 2048비트 모듈러스, 광범위하게 지원되지만 느림. TLS 인증서에 사용.
  • RSA-4096 — 더 강하지만 더 느림.
  • Curve25519 (X25519) — 256비트 타원 곡선 키, 빠름. Signal과 WireGuard가 사용.
  • Ed25519 — 256비트 서명 키, SSH와 Git 커밋 서명에 사용.

개인 키 자체는 알고리즘에 따라 32~512바이트입니다. RSA 개인 키는 여러 소수를 포함하므로 더 크고, Curve25519 개인 키는 단지 32바이트의 무작위 데이터입니다.

하이브리드: 두 방식의 결합

실제로는 어떤 시스템도 RSA로 대용량 파일을 직접 암호화하지 않습니다. TLS, PGP, Age, Signal, 모든 진지한 파일 전송 서비스는 하이브리드 암호화를 사용합니다.

  1. 무작위 256비트 AES 키("세션 키" 또는 "파일 키")를 생성합니다.
  2. AES-256-GCM으로 파일을 암호화합니다.
  3. 수신자의 공개 키로 세션 키를 암호화합니다.
  4. 둘 다 전송합니다.

수신자는 개인 키로 세션 키를 복호화한 뒤, 이를 사용해 파일을 복호화합니다. 대칭 암호화의 속도와 비대칭의 키 배포 편의성을 모두 얻습니다.

브라우저 기반 파일 전송에서는 "공개 키"가 URL 프래그먼트로 대체되는 경우가 많습니다. 발신자가 세션 키를 생성하고 # 뒤 URL에 삽입하면, 수신자의 브라우저가 로컬에서 읽습니다. 더 단순하며 수신자에게 키 쌍이 없어도 됩니다.

비밀번호에서 키 파생하기

사용자는 비밀번호를 입력하지만 알고리즘은 균일한 무작위 비트를 원합니다. 키 파생 함수(KDF)가 이를 연결합니다.

  • PBKDF2-HMAC-SHA-256 — 해시 함수를 반복합니다. OWASP 2023은 600,000회 반복을 권장합니다. Web Crypto API에서 사용 가능합니다.
  • scrypt — 메모리 경도로 GPU 공격에 저항합니다. 매개변수: N=2^17, r=8, p=1.
  • Argon2id — 현재 최고의 권장 방식. 2015년 Password Hashing Competition 우승. 매개변수: memory=64 MB, iterations=3, parallelism=4.

KDF는 솔트(무작위, 암호문 옆에 저장)와 작업 인수(반복 횟수)를 추가해 브루트 포스를 늦춥니다. Argon2id와 64MB 메모리를 통해 파생된 12자 무작위 비밀번호는 GPU 팜이 소진하는 데 수천 년이 걸립니다. summer2024 같은 약한 비밀번호는 KDF에 관계없이 초 단위로 노출됩니다. KDF는 없던 엔트로피를 추가할 수 없습니다.

키 저장소: 키는 어디에 보관되나요?

키는 어딘가에 존재해야 하며, 그 어딘가가 보안에서 중요한 결정입니다.

  • 브라우저 메모리 (세션 전용). 일회성 파일 전송의 기본. 키는 생성, 사용, 페이지 로드 내에서 폐기됩니다.
  • URL 프래그먼트. 링크로 공유되며 수신자의 브라우저 히스토리에 저장됩니다. 제한된 수명이 중요합니다.
  • 로컬 스토리지 / IndexedDB. 영구적이지만 출처의 모든 JavaScript에서 접근 가능합니다. 다른 키로 암호화하지 않으면 위험합니다.
  • OS 키체인 — macOS Keychain, Windows DPAPI, Linux libsecret. 일부 플랫폼에서 하드웨어 지원.
  • 하드웨어 보안 모듈(HSM) — YubiKey, 클라우드 HSM(AWS CloudHSM, Azure Dedicated HSM). 키가 하드웨어를 떠나지 않습니다.
  • 키 관리 서비스(KMS) — AWS KMS, Google Cloud KMS, HashiCorp Vault. 중앙화되고 감사 가능하며 키당 월 약 1달러.

영지식 파일 전송의 경우, 키는 URL 프래그먼트와 발신자의 브라우저에 존재합니다. 서버는 절대 이를 저장하지 않습니다.

키 교체와 폐기

오래 사용된 키는 위험을 축적합니다. 모범 사례는 교체입니다.

  • TLS 인증서: 90일 교체(Let's Encrypt 기본), 공개 CA의 경우 2020년부터 최대 398일.
  • 데이터 암호화 키: 규정 준수 시스템에서 90일~1년마다 교체(PCI DSS 4.0 요구사항 3.6).
  • 마스터 키: 연간 또는 인사 변경 시 교체.

폐기도 중요합니다. 디스크에서 키 파일을 단순 삭제하는 것은 부족합니다. SSD는 웨어 레벨링 영역에 데이터를 보관할 수 있습니다. 안전한 폐기는 덮어쓰기나 전용 HSM 삭제 명령이 필요합니다. 암호화 지우기, 즉 키를 버려 암호화된 데이터를 영구적으로 읽을 수 없게 만드는 것이 대량 데이터에 가장 깔끔한 접근법입니다.

파일 전송 서비스는 일반적으로 전송 수명(24시간~7일) 동안만 존재하는 파일별 키를 사용하며, 만료 시 암호문과 함께 폐기됩니다.

취약한 키 관행 식별하기

주의해야 할 세 가지 일반적인 실패 모드입니다.

  • 클라이언트 코드에 하드코딩된 키. 모든 사용자에게 같은 키가 사용된다면 그것은 키가 아니라 난독화입니다.
  • 같은 서버나 데이터베이스에 암호문과 함께 저장된 키. 침해 시 둘 다 노출됩니다.
  • 키 교체 없음. 10년된 암호화 키를 가진 레거시 시스템은 10년치 침해 위험을 축적합니다.

신뢰할 수 있는 서비스는 키 생성, 저장, 교체, 폐기를 다루는 암호화 백서를 공개하고, Cure53나 Trail of Bits 같은 회사의 제3자 감사를 받습니다.

GDPR, HIPAA, PIPA와 키 관리

GDPR 제25조(설계에 의한 데이터 보호), HIPAA의 기술적 세이프가드, 그리고 한국의 개인정보 보호법(PIPA) 모두 암호화된 데이터의 적절한 키 관리를 요구합니다. 클라이언트 측 키 생성과 자동 만료는 이러한 요구사항을 충족하는 가장 간단한 방법입니다. 서버가 키를 보유하지 않으면 침해 시 알릴 것이 없습니다.

민감한 파일 공유를 위해서는 crypto.getRandomValues()를 통해 클라이언트 측에서 256비트 키를 생성하고, URL 프래그먼트에만 삽입(서버에는 절대 전송하지 않음)하며, PBKDF2 또는 Argon2id를 통한 비밀번호 파생 키를 지원하고, 키와 암호문 모두 24시간 내에 자동 만료되는 서비스를 선택하세요.

hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.

엔드투엔드 암호화로 대용량 파일을 안전하게 전송

엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.

파일 보내기