개발 이야기4분 읽기

서명과 암호화는 다른 일이다

공개키로 잠그는 것과 개인키로 서명하는 것은 방향이 반대입니다. 키 두 개의 역할, RSA와 ECDSA의 차이를 정리했습니다.

공개키 암호에서 키는 짝으로 만들어집니다. 하나는 공개하고 하나는 감춥니다. 여기까지는 명확한데, 어느 키로 무엇을 하는지는 자주 뒤섞입니다. 두 작업의 방향이 반대이기 때문입니다.

방향이 반대다

암호화 — 보내는 사람이 받는 사람의 공개키로 잠급니다. 개인키를 가진 사람만 열 수 있습니다.

  • 공개키는 누구나 가질 수 있으므로 아무나 나에게 비밀을 보낼 수 있습니다
  • 열 수 있는 사람은 개인키를 가진 한 명입니다

서명 — 만드는 사람이 자기 개인키로 서명합니다. 공개키를 가진 사람은 누구나 확인할 수 있습니다.

  • 만들 수 있는 사람은 개인키를 가진 한 명입니다
  • 아무나 그것이 그 사람에게서 나왔음을 확인할 수 있습니다

정리하면 이렇습니다.

만드는 데 쓰는 키 확인·해독에 쓰는 키 보장하는 것
암호화 상대의 공개키 상대의 개인키 내용이 감춰진다
서명 내 개인키 내 공개키 누가 만들었고 바뀌지 않았다

서명은 내용을 감추지 않습니다. 서명된 문서는 그대로 읽힙니다. 서명이 보장하는 것은 작성자와 변조 여부입니다.

"개인키로 암호화한다"는 표현

서명을 설명할 때 "개인키로 암호화하고 공개키로 복호화한다"고 적힌 글이 많습니다. RSA에서 수식이 비슷해 보여 생긴 설명인데, 실제 구현과는 다릅니다.

지금 쓰이는 RSA 서명(PSS)과 암호화(OAEP)는 서로 다른 패딩과 절차를 씁니다. 서명은 문서 전체가 아니라 문서의 해시에 대해 이루어집니다. 그래야 문서 크기와 무관하게 서명 길이가 일정합니다.

그래서 정확한 문장은 이쪽입니다. 개인키로 서명하고, 공개키로 검증한다.

RSA와 ECDSA

RSA는 암호화와 서명을 모두 할 수 있습니다. 오래되어 지원 범위가 넓습니다. 대신 안전한 크기를 유지하려면 키가 커집니다. 지금 기준은 2048비트 이상이고, 4096비트를 쓰기도 합니다.

ECDSA는 서명 전용입니다. 이 알고리즘으로는 데이터를 암호화할 수 없습니다. 타원곡선으로 키를 교환해야 한다면 ECDH라는 별도 방식을 씁니다.

크기 차이가 큽니다. ECDSA의 P-256 곡선은 RSA 3072비트와 비슷한 강도로 평가되는데 키는 256비트입니다. 서명도 짧고 계산도 빠릅니다. 인증서, JWT, SSH 키에서 점점 ECDSA와 Ed25519 쪽으로 옮겨 가는 이유입니다.

RSA로 파일을 암호화하지 않는다

RSA는 키 길이보다 긴 데이터를 암호화할 수 없습니다. 2048비트 키로는 패딩을 빼고 200바이트 남짓이 한계입니다. 느리기도 합니다.

그래서 실제로는 두 가지를 섞어 씁니다.

  1. 임의의 대칭키를 만듭니다
  2. 본문은 그 키로 AES 암호화합니다
  3. 그 대칭키만 상대의 공개키로 RSA 암호화합니다
  4. 둘을 함께 보냅니다

TLS도, 암호화 메일도 이 구조입니다. 공개키 암호는 열쇠를 전달하는 데 쓰고, 내용은 대칭키로 처리합니다.

어디서 마주치나

  • TLS 인증서 — 인증 기관이 서명하고, 브라우저가 공개키로 검증합니다
  • JWTRS256은 RSA 서명, ES256은 ECDSA 서명입니다. 발급자만 만들 수 있고 검증은 공개키로 합니다. 반면 HS256은 공개키가 아니라 양쪽이 같은 비밀키를 공유하는 방식입니다
  • SSH — 서버에 공개키를 두고, 접속할 때 개인키로 서명해 신원을 증명합니다. 개인키는 전송되지 않습니다
  • 패키지와 커밋 서명 — 배포물이 게시자에게서 나왔고 중간에 바뀌지 않았음을 확인합니다

개인키를 다룰 때

개인키가 유출되면 그 신원으로 서명할 수 있게 됩니다. 암호문이 풀리는 것보다 넓은 피해입니다.

  • 키는 로컬에서 만듭니다. 온라인 도구를 쓴다면 브라우저 안에서 생성되는지 확인합니다
  • 개인키는 저장소에 넣지 않습니다. 실수로 커밋했다면 지우는 것으로 끝나지 않고 새 키를 만들어 교체해야 합니다
  • 파일 권한을 제한합니다. SSH는 권한이 느슨하면 아예 거부합니다
  • 공개키는 어디에 두어도 됩니다. 그게 공개키의 용도입니다

tools.onuel.dev에서 RSA 키 생성ECDSA 키 생성을 해 보면 같은 강도에서 키 크기가 얼마나 차이 나는지 바로 보입니다. RSA 서명RSA 암호화가 따로 있어 두 작업의 차이도 확인할 수 있습니다. 생성과 계산이 모두 브라우저 안에서 이루어집니다.

  • #공개키
  • #전자서명
  • #암호화