VPN에서 대칭키 암호화와 공개키 암호화: 각각 하는 일
VPN은 공개키로 피어를 인증한 뒤 파생된 세션 키로 패킷을 암호화합니다. 인증서와 트래픽 키를 서로 다른 객체로 다루세요.
사람들은 VPN을 „공개키 암호화를 사용하는 것“이라고 설명한 뒤, 모든 패킷이 서버 인증서로 잠긴다고 상상합니다. 이 그림은 구성 파일이나 패킷 쪽처를 읽을 때 중요한 방식으로 틀렸습니다. VPN의 공개키 절반은 상대가 누구인지 증명하고 비밀 재료에 합의하는 일이고, 대칭 절반이 세션 수명 내내 패킷마다 트래픽을 실제로 보호합니다.
두 절반은 수명도, 실패 방식도, 안전하게 공개할 수 있는 것도 다릅니다. 둘을 분리하면 „RSA 2048이 AES-128보다 약한가“ 같은 질문은 더 이상 혐란을 주지 않습니다. 애초에 비교 가능한 대상이 아니었기 때문입니다.
함께 뭉뚚그러지는 세 가지 연산
공개키 암호학은 적어도 세 가지 서로 다른 연산을 아우르는 우산입니다. 서명은 개인키 소유자가 특정 메시지를 승인했음을 증명합니다. 키 합의는 두 피어가 공개적으로 교환한 값에서 공유 비밀을 도출하게 합니다. 공개키 암호화는 데이터를 누군가의 공개키 아래 숨겨 개인키만 열 수 있게 합니다.
VPN 핸드셰이크는 주로 처음 두 가지를 씁니다. 인증서는 암호화 키가 아니라 이름을 공개키에 묶는 서명된 진술이며, 상대가 방금 받은 키를 신뢰할지 결정하게 합니다. 예를 들어 TLS 1.3의 키 설정은 (EC)DHE 키 합의와 인증서 서명에 기반하며, 서버의 공개키로 세션을 암호화하는 것이 아닙니다.
핸드셰이크가 실제로 만들어 내는 것
현대 핸드셰이크에서 각 측은 임시 키 쌍을 만들고 공개 절반을 교환하며, 전선을 건너지 않는 공유 비밀을 계산합니다. 그 비밀은 키 도출 함수를 거쳐 방향별로 별도의 키와, 레코드 계층이 필요로 하는 nonce와 IV 재료를 만듭니다. WireGuard는 Noise 기반 구조로, TLS 1.3은 핸드셰이크 트랜스크립트에 대한 HKDF로 이를 수행합니다.
장기 자격 증명, 즉 인증서와 개인키 또는 정적 WireGuard 키는 그 교환을 인증합니다. 트랜스크립트에 서명하거나 섞여 들어가 제삼자가 상대를 대신해 핸드셰이크를 끝낼 수 없게 합니다. 그 뒤 자격 증명은 패킷마다 작업을 하지 않습니다. 만약 그랬다면 모든 패킷에 개인키 연산이 필요했고, 바쁜 터널은 스택에서 가장 느린 연산에 묶였을 것입니다.
부작용이 둘 있습니다. 첫째, 세션 키는 매번 새롭기 때문에 나중에 장기 키를 훔친 공격자도 합의가 일시적이었다면 이전에 기록된 세션을 복호화할 수 없습니다. 둘째, 유출된 세션 키는 하나의 세션을 위험에 빠뜨릴 뿐 신원을 위협하지 않습니다.
대용량 데이터가 대칭키를 쓰는 이유
대칭 암호는 양을 잘 감당합니다. AES-GCM이나 ChaCha20-Poly1305는 이미 메모리에 있는 키로 각 패킷을 처리하고, 헤더를 인증하며, 카운터를 증가시킵니다. 수신 측은 nonce와 인증 태그를 확인하고 실패하거나 재생된 것은 버립니다. 이는 일반 하드웨어에서 회선 속도로 돌릴 만큼 저렴하며, 같은 구조가 한 번의 처리로 기밀성과 무결성을 제공합니다.
이 구조는 구현 버그가 대부분 사는 곳이기도 합니다. GCM에서 nonce가 반복되면 기밀성과 진정성이 동시에 깨지므로, 프로토콜은 방향별로 키를 도출하고 명시적 카운터나 에포크를 유지합니다. 패킷 쪽처를 읽는데 암호문 길이가 평문에 고정 오버헤드를 더한 것과 맞다면, 작동하는 것은 대칭 계층이며 패킷마다의 공개키 연산이 아닙니다.
수명, 키 갱신, 전방 비밀성
세션 키는 만료되도록 되어 있습니다. TLS 1.3은 KeyUpdate 메시지로 트래픽 키를 갱신할 수 있고, WireGuard는 설정된 시간이나 메시지 수 후에 세션을 갱신하며 지나가는 패킷을 위해 이전 키를 잠시 유지합니다. OpenVPN은 일정에 따라 데이터 채널 키를 다시 협상하고, reneg-sec이 간격을 제어합니다.
그 갱신 중 어느 것도 인증서 갱신과 같지 않습니다. 인증서는 일 년 동안 유효한데 세션 키는 몇 분마다 바뀜 수 있고, 실행 중인 터널의 키를 건드리지 않고 인증서를 교체할 수 있습니다. 만료를 계획할 때는 어느 객체를 갱신하는지 물으세요. 그 답이 클라이언트가 다시 연결할지 아니면 키만 갱신할지를 결정합니다.
객체를 섞지 않고 구성과 진단 읽기
실제로는 완전한 프로토콜과 그 지원 프리미티브를 고르는 것이지 직접 조립하는 것이 아닙니다. OpenVPN의 --tls-crypt 키는 제어 채널을 보호하고, 데이터 채널은 협상된 대칭 암호를 씁니다. WireGuard의 PrivateKey과 PublicKey 항목은 신원 재료이며, 전송 키는 내부에서 도출됩니다. 그 필드를 같은 종류의 비밀로 읽으면 개인키가 있어야 할 자리에 공개키를 뷙이는 같은 실수로 이어집니다.
공개 재료를 비공개 재료와 분리해 두세요. 인증서, WireGuard 공개키, 지문은 티켓에 공유해도 안전합니다. 개인키, 사전 공유 키, 내보낸 세션 키는 그렇지 않습니다. 강도를 비교할 때는 같은 유형 안에서 비교하세요. 타원 곡선 식별자, RSA 모듈러스 크기, AES 키 크기는 서로 다른 가정 아래 서로 다른 것을 측정합니다. TLS 1.3 명세는 터널이 TLS가 아니어도 두 계층이 어떻게 맞물리는지 알려 주는 유용한 참고 자료입니다.