블로그보안

RSA 키 쌍 설명: 공개키, 개인키, 그리고 각각이 하는 일

RSA 키의 공개키와 개인키가 실제로 하는 일, 암호화와 서명의 차이, 키 크기가 중요한 이유, 그리고 언제 대신 EdDSA를 선택해야 하는지를 다룹니다.

ssh-keygen을 실행하거나 JWT용 서명 키를 생성하면 두 개의 덩어리가 나옵니다. 자유롭게 나눠 주라고 안내받는 공개키와, 목숨을 걸고 지키라고 안내받는 개인키입니다. 이 비대칭성이야말로 RSA의 핵심이지만, 어느 쪽이 무슨 일을 하는지 명확히 그리지 못한 채 수년 동안 키를 사용하기 쉽습니다. 규칙은 단순하며, 이를 정확히 잡아 두면 실제로 문제가 되는 실수를 막을 수 있습니다.

두 개의 키, 하나의 수학 문제

대칭 암호화는 하나의 공유된 비밀을 사용합니다. 같은 키가 잠그고 풉니다. RSA는 비대칭입니다. 수학적으로 연결된 한 쌍을 생성하며, 한 키가 한 일은 오직 다른 키만 되돌릴 수 있습니다. 두 키는 큰 수(모듈러스)로부터 만들어지는데, 이 수는 두 개의 큰 소수의 곱입니다. 보안은 노력의 단순한 비대칭에 기반합니다. 소수를 곱하는 것은 매우 쉽지만, 모듈러스를 다시 소수로 인수분해하는 것은 충분히 큰 크기에서는 사실상 불가능합니다. 공개키는 공유될 수 있습니다. 그것을 안다고 해서 소수가 드러나지 않기 때문입니다. 개인키는 그 소수를 비밀스럽게 알고 있는 쪽입니다.

암호화, 서명, 해시라는 단어가 서로 바꿔 쓸 수 있는 것처럼 느껴진다면, 그렇지 않습니다. 해싱, 암호화, 인코딩의 구분은 다음 부분으로 넘어가기 전에 확실히 짚어 둘 가치가 있습니다. RSA는 이 셋 중 둘을 수행하며, 사람들이 흔히 이를 혼동하기 때문입니다.

두 가지 연산, 그리고 어느 키가 어디에 쓰이는가

RSA는 두 가지 서로 다른 연산을 지원하며, 두 연산은 키를 반대 방향으로 사용합니다. 이 점이 가장 많이 혼동되는 부분이므로 단도직입적으로 말해 둘 가치가 있습니다.

  • 암호화 — 누구나 공개키로 암호화할 수 있으며, 개인키를 가진 사람만 복호화할 수 있습니다. 이것이 누군가에게 비밀을 보내는 방식입니다. 상대방의 공개키가 그것을 잠그고, 상대방의 개인키가 그것을 엽니다.
  • 서명 — 소유자가 개인키로 서명하고, 누구나 공개키로 검증합니다. 이는 메시지가 키 소유자에게서 왔으며 변조되지 않았음을 증명합니다. 메시지를 숨기지는 않습니다. 서명은 진정성이지 기밀성이 아닙니다.

거울에 비친 듯한 이 대칭이 사람들을 헷갈리게 합니다. 암호화는 공개키를 사용하고, 서명은 개인키를 사용합니다. 이를 기억하는 유용한 방법이 있습니다. 개인키는 오직 당신만 가진 키이므로, 오직 당신만 할 수 있어야 하는 연산, 즉 당신에게 온 메시지를 복호화하는 것과 당신으로서 서명하는 것이 개인키 연산입니다.

키 크기, 그리고 2048이 하한선인 이유

RSA의 보안은 비트로 측정되는 모듈러스 크기에 따라 커집니다. 오늘날 실용적인 기준선은 2048비트입니다. 3072나 4096은 더 많은 여유를 주지만 연산이 느려지고 키가 커지는 대가를 치릅니다. 1024 이하는 깨진 것으로 간주되며 교체해야 합니다. 증가는 선형적이지 않습니다. 3072비트 RSA 키는 강도 면에서 대략 128비트 대칭 키에 비견되며, 이것이 키가 제공하는 보호에 비해 그렇게 크게 느껴지는 이유 중 하나입니다.

그 부피가 RSA의 주된 단점이며, 아래에 소개하는 대안의 이유이기도 합니다.

RSA가 등장하는 곳

RSA 키 쌍은 일상의 몇몇 곳에서 마주치게 됩니다.

  • TLS — 역사적으로 서버의 RSA 키가 핸드셰이크를 인증했습니다(현대 TLS는 교환 자체에 점점 더 타원곡선 키를 사용합니다).
  • SSHssh-keygen -t rsa는 그 공개키 절반을 authorized_keys에 붙여 넣게 되는 키 쌍을 만듭니다.
  • JWTRS256 알고리즘은 RSA 개인키로 토큰에 서명하여 공개키를 가진 누구든 검증할 수 있게 하며, 이 방식은 JWT 서명 알고리즘에서 대안들과 비교됩니다.

RSA 대 타원곡선 선택지

서명에 있어서 RSA는 더 이상 당연한 기본값이 아닙니다. EdDSA(Ed25519)와 ECDSA는 훨씬 작은 키로 동등한 보안에 도달하며(Ed25519 키는 32바이트인데 비견되는 RSA 키는 수백 바이트입니다) 더 빠르게 서명합니다. 오늘날 RSA의 장점은 대부분 호환성입니다. 일부 오래된 시스템은 RSA만 사용하며, RSA는 직접 암호화할 수 있는 반면 EC 방식은 서명 전용입니다(거기서 암호화는 키 교환 단계를 거칩니다). 레거시 제약이 없는 새 서명 키라면 보통 Ed25519가 더 나은 선택입니다. 스택의 무언가가 RSA를 요구할 때 RSA를 선택하십시오.

실제로 보게 될 PEM 형식

키는 PEM으로 저장됩니다. -----BEGIN ... ----- 마커로 감싼 base64입니다. 헤더가 그 레이아웃을 알려 줍니다. BEGIN PUBLIC KEYBEGIN PRIVATE KEY는 알고리즘 식별자를 키와 함께 담는 현대적인 PKCS#8/SPKI 인코딩입니다. BEGIN RSA PRIVATE KEY는 RSA에 특화된 더 오래된 PKCS#1 형식입니다. 이들은 같은 키를 다른 봉투에 담고 있으며, 그래서 도구가 때때로 둘 사이를 변환하도록 요구합니다. base64 자체는 그저 인코딩일 뿐이라 누구나 읽을 수 있고 보호 기능이 없습니다. 따라서 개인키 PEM은 그것을 둘러싼 파일 권한과 패스프레이즈만큼만 안전합니다.

주의할 점

여기서는 대부분의 도구보다 솔직한 한계가 더 중요합니다.

  • RSA를 직접 구현하지 마십시오. 올바른 패딩(암호화는 OAEP, 서명은 PSS)이 없는 교과서적 RSA는 공격에 노출됩니다. 검증된 라이브러리와 올바른 패딩 모드를 사용하십시오.
  • 공개키가 TLS를 건너뛰어도 된다는 면허는 아닙니다. 누군가의 공개키로 페이로드를 암호화하면 그 페이로드는 보호되지만, 연결의 나머지는 보호되지 않습니다.
  • 개인키를 지키고 교체하십시오. 개인키의 유일한 보호는 비밀성입니다. 일단 유출되면, 그것이 지금까지 지켜 온 모든 서명과 복호화가 손상되며, 수학을 철회할 방법은 없습니다.

아무것도 설치하지 않고 실제 키 쌍의 두 절반을 보려면, 저희 RSA 키 쌍 생성기가 브라우저에서 키 쌍을 하나 만들어 주므로 위에 설명한 PEM 구조를 살펴볼 수 있습니다. 일회용 키 쌍을 생성해 PUBLIC/PRIVATE 마커가 어디에 떨어지는지 보면, 이 글의 나머지가 더 이상 추상적이지 않게 됩니다.