무료 온라인 RSA 키 쌍 생성기 — ECDSA와 Ed25519
온라인 RSA 키 쌍 생성기. 개인 키는 브라우저에 머뭅니다. 2048/4096·ECDSA·Ed25519, PKCS#8·PKCS#1 PEM.
PKCS#8(BEGIN PRIVATE KEY)이 현대적인 기본값이며 JDK가 기대하는 형식입니다. PKCS#1(BEGIN RSA PRIVATE KEY)은 OpenSSL의 전통적 형식으로, 일부 게이트웨이가 여전히 요구합니다. 전환해도 같은 키를 다시 인코딩할 뿐입니다.
비밀로 유지하세요. 이 키를 가진 사람은 누구나 사용자를 사칭할 수 있습니다.
OpenSSL로 같은 종류의 키 쌍 생성
저희 팀은 PKCS#8에서 PKCS#1로의 변환을 Node crypto 모듈의 기준 출력과 바이트 단위로 대조해 검증하므로, 여기서 내보낸 키는 같은 재료에 대해 OpenSSL이 만들어 낼 키와 동일합니다.
RSA 키 생성기란?
RSA 키 생성기는 수학적으로 짝지어진 한 쌍 — 사용자가 보관하는 개인 키와 남에게 건네는 공개 키 — 을 만듭니다. 개인 키 쪽으로 서명한 것은 공개 키 쪽으로 검증할 수 있으며, 공개해도 안전한 것은 공개 키 쪽뿐입니다. 이 비대칭성이 핵심입니다. 덕분에 검증자는 위조 능력을 얻지 않은 채 서명을 확인할 수 있는데, 공유 비밀로는 결코 할 수 없는 일입니다.
이 생성기는 Web Crypto API를 통해 브라우저 안에서 동작하므로 개인 키는 탭 안에서 만들어지고, 생성하는 동안 페이지는 어떤 네트워크 요청도 보내지 않습니다. RSA 외에 ECDSA와 Ed25519 키 쌍도 생성하며, 이들은 훨씬 짧은 키로 같은 목적을 수행합니다. Ed25519 개인 키는 PKCS#8로 48바이트인 반면, 2048비트 RSA 키는 1.2 KB를 넘어갑니다.
사람들이 걸려 넘어지는 지점은 수학이 아니라 포장입니다. 같은 키를 PKCS#8, PKCS#1, SPKI, JWK로 적을 수 있는데, 한쪽을 거부하는 라이브러리가 파싱 오류보다 친절한 메시지 없이 다른 쪽만 받아들이는 일이 흔합니다. 아래 표가 각 컨테이너를 그것을 기대하는 생태계에 대응시켜 줍니다.
// Verify a downloaded key pair matches, using OpenSSL: openssl pkey -in rsa-2048-private.pem -pubout | diff - rsa-2048-public.pem // No output means the public key really belongs to that private key.
주요 기능
브라우저 안에서 생성됩니다
키는 사용자 탭 안의 Web Crypto API에서 나오며, 생성하는 동안 페이지는 어떤 네트워크 요청도 보내지 않습니다. 연결을 끊어도 계속 동작하는데, 이는 이 도구가 제 일을 하는 데 서버가 필요 없다는 것을 보여 줍니다.
RSA, ECDSA, Ed25519
RSA 2048·3072·4096, P-256·P-384·P-521 곡선의 ECDSA, 그리고 Ed25519를 한 페이지에서 같은 내보내기 옵션으로 다룹니다.
PKCS#8과 PKCS#1 출력
OpenSSL을 건드리지 않고 BEGIN PRIVATE KEY와 전통적인 BEGIN RSA PRIVATE KEY 구조를 오갈 수 있습니다. 스위치는 화면에 이미 있는 키를 다시 인코딩하므로 여전히 같은 키입니다.
JWK 내보내기
양쪽 절반 모두 JSON Web Key로 나옵니다. JWKS 문서나 JOSE 검증자에 들어가는 것은 공개 JWK이며, 개인 JWK는 서명하는 쪽만 쓰고 절대 게시해서는 안 됩니다.
SHA-256 지문
모든 키 쌍에 공개 키 지문이 함께 나오므로, 양쪽이 같은 키를 갖고 있는지 별도 채널로 검증할 수 있습니다.
대응하는 OpenSSL 명령
같은 종류의 키를 로컬에서 생성하는 대응 명령이 출력 아래에 표시되어, 원할 때 언제든 명령줄로 옮겨 갈 수 있습니다.
알아보기 쉬운 이름으로 다운로드
파일은 이름을 다시 바꿔야 하는 일반적인 다운로드 이름이 아니라 rsa-2048-private.pem, rsa-2048-public.pem으로 저장됩니다.
계정도 사용량 제한도 없음
서버가 관여하지 않으므로 가입할 것도, 소진할 할당량도 없습니다.
실전 예시
Ed25519 키 쌍 전체
알고리즘: Ed25519
-----BEGIN PRIVATE KEY----- MC4CAQAwBQYDK2VwBCIEIA2HJVU1qChbOJN8XksXVhyD0IjYVt0UU6Mwz814rOFf -----END PRIVATE KEY----- -----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAV5uB7UaPJrtncx3SXNtNzn1ZXjF1ApwvzBZ8nFzT5eU= -----END PUBLIC KEY-----
Ed25519 개인 키는 PKCS#8로 48바이트, 공개 키는 44바이트라 각 PEM이 base64 한 줄로 끝납니다. 이것은 일회용 시연 키 쌍입니다 — 복사해 쓰지 말고 직접 생성하세요.
PKCS#8과 PKCS#1은 헤더가 다릅니다
알고리즘: RSA 2048, 구조 전환
PKCS#8: -----BEGIN PRIVATE KEY----- PKCS#1: -----BEGIN RSA PRIVATE KEY-----
같은 키, 두 가지 포장입니다. PKCS#8은 RSA 구조 바깥에 알고리즘 식별자를 덧씌우며, 그래서 모든 알고리즘에 통하는 반면 PKCS#1은 RSA 전용으로만 존재합니다. 스위치를 전환하면 화면에 이미 있는 키를 다시 인코딩할 뿐이므로 지문은 바뀌지 않습니다.
RSA 2048 공개 키
알고리즘: RSA 2048
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtuvUHLjyK9zje2aaNIni eSccN1uleXFRBb1g2TN6bk/fbpPCGDyh71m73oB9Bk8+fKVkSThXyWTtpgblB7pX iQBtTvSWVZGHprkLgMGkU2Yw8Z43m1WpoRuYyXNFe92S5viIdVuKTj/VEUuEpzHd ffWMIUw70LaUdTP04iQdkNVeS3M6VHkpTwsPSQfsFSwObtLVNy2Lf+ODwJRqCk2r C749hgKqBdJqkcIj49R7UP4SMQ/9V3yy8DFMrIcgsjC4tHwlQSCGeXNxTNlapGSa ke55LUR83FASryVJRbUs678SCZSFkyGcT0qLZ/olu/e7Jj2lB0Qy/SJawkrs9hPE 4QIDAQAB -----END PUBLIC KEY-----
앞머리의 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A는 rsaEncryption 알고리즘 식별자로, RSA SPKI 키를 눈으로 알아보는 단서입니다.
JWK 형태의 공개 키
알고리즘: Ed25519, JWK 패널
{
"key_ops": [
"verify"
],
"ext": true,
"alg": "Ed25519",
"crv": "Ed25519",
"x": "V5uB7UaPJrtncx3SXNtNzn1ZXjF1ApwvzBZ8nFzT5eU",
"kty": "OKP"
} Web Crypto가 항상 덧붙이는 key_ops와 ext 멤버까지 포함한, 내보내기 결과 그대로입니다. JWKS 항목에는 이 둘이 필요 없으니 지우고, 대신 순환 중에 검증자가 올바른 키를 고를 수 있도록 kid와 use를 넣으세요. Ed25519는 OKP 키 타입에 들어가고, RSA 키는 kty가 RSA이며 n과 e 멤버를 갖습니다.
SHA-256 지문
알고리즘: Ed25519
SHA256(SPKI) = KAXVxapxpG4zLsTVMpPafovT+X1NLWc8fsOXqtrb59o=
공개 키 구조의 SHA-256 다이제스트로, 전화로 읽어 줄 수 있을 만큼 짧습니다. 이 값은 ssh-keygen이 출력하는 값과 다릅니다 — OpenSSH는 자체 와이어 형식을 해싱하므로 같은 키라도 두 값은 결코 일치하지 않습니다.
RSA 키 생성기 사용법
- 1
알고리즘 선택
RSA는 레거시 시스템을 가장 넓게 아우릅니다. ECDSA는 훨씬 작은 키로 동등한 강도를 냅니다. Ed25519는 새로 시작하는 서명 작업의 현대적 기본값입니다.
- 2
키 크기 선택
RSA 2048은 현재 권고를 충족하며, 3072과 4096은 오래 쓸 키에 여유를 더합니다. ECDSA는 P-256, P-384, P-521을 지원합니다. Ed25519는 크기가 하나로 고정되어 있습니다.
- 3
PEM 구조 선택
PKCS#8은 BEGIN PRIVATE KEY를 내보내며 JDK를 포함해 거의 모든 곳에서 동작합니다. 무언가가 BEGIN RSA PRIVATE KEY를 콕 집어 요구할 때만 PKCS#1로 전환하세요.
- 4
양쪽 절반 복사 또는 다운로드
개인 키는 시크릿 저장소로, 공개 키는 서명을 검증할 상대에게 보내세요. 개인 키 쪽은 어디에도 보내지 마십시오.
- 5
지문 확인
SHA-256 지문을 별도 채널로 대조해, 상대가 실제로 사용자가 생성한 그 공개 키를 설치했는지 확인하세요.
흔한 키 형식 실수
개인 키 자리에 공개 키를 붙여넣기
서명에는 개인 키 쪽이 필요합니다. 개인 키를 기대한 자리에 BEGIN PUBLIC KEY가 들어오면, 라이브러리는 진짜 문제를 짚어 주는 대신 대개 도움 안 되는 파싱 오류를 냅니다.
-----BEGIN PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
라이브러리에 맞지 않는 PEM 구조
전통적인 RSA 구조만 읽는 생태계는 몇 안 됩니다 — OpenSSL 자신의 -traditional 출력, 일부 결제 게이트웨이 SDK, 오래된 Ruby·Perl 도구 정도입니다. 최신 라이브러리 대부분은, 특히 JDK는 PKCS#8을 기대합니다. 변환 명령을 찾아 헤매지 말고 PEM 구조 전환 스위치를 쓰세요.
-----BEGIN RSA PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
끝의 줄바꿈을 잃어버리기
PEM 파일은 마지막 구분선 뒤에 줄바꿈으로 끝납니다. 공백을 잘라내는 입력 필드를 거쳐 복사하면 일부 파서가 아예 거부하는 파일이 됩니다 — 게다가 빠진 문자가 눈에 보이지 않으니 편집기에서는 멀쩡해 보입니다.
-----END PRIVATE KEY-----[EOF]
-----END PRIVATE KEY-----↵[EOF]
옮기는 중에 사라진 문자 하나
PEM을 망가뜨리는 것은 줄 너비가 아니라 사라지거나 끼어들거나 뒤바뀐 문자 하나입니다 — 파서 대부분은 어떤 줄바꿈 폭이든 받아들입니다. 채팅 클라이언트나 입력 필드를 거친 복사는 줄바꿈을 소리 없이 공백으로 바꿔 놓을 수 있고, base64는 어느 문자가 잘못됐는지 아무 단서도 주지 않습니다. 키는 그저 로드에 실패할 뿐입니다. 손으로 선택하지 말고 복사 버튼을 쓰세요.
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtuvUHLjyK9zje2aaNIni eSccN1uleXFRBb1g2TN6bk
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtuvUHLjyK9zje2aaNIni eSccN1uleXFRBb1g2TN6bk
RS256 설정에 HS256 비밀 키를 쓰기
HS256은 공유 비밀 하나를, RS256은 키 쌍을 씁니다. RS256 서명기에 무작위 문자열을 넣으면 파싱 단계에서 실패합니다. 여기서 키 쌍을 생성하거나, HS256을 의도했다면 JWT 비밀 키 생성기를 쓰세요.
alg: RS256, key: 8f3a9c2e1b7d
alg: RS256, key: -----BEGIN PRIVATE KEY-----
authorized_keys에 PEM 붙여넣기
SSH 공개 키는 PEM 블록이 아니라 OpenSSH의 한 줄짜리 ssh-ed25519 AAAA… 형식이므로, 이 페이지의 공개 키를 authorized_keys에 붙여넣어도 동작하지 않습니다. RSA 키라면 로컬에서 ssh-keygen -y로 올바른 줄을 도출할 수 있고, SSH 접속 전반으로는 대상 기기에서 생성하는 편이 그래도 낫습니다.
-----BEGIN PUBLIC KEY-----
ssh-keygen -y -f rsa-2048-private.pem > id_rsa.pub
누가 이 도구를 쓰나
- RS256이나 EdDSA로 JWT 서명
- 비대칭 JWT 알고리즘은 공유 비밀이 아니라 키 쌍을 필요로 합니다. 개인 키로 서명하고 공개 키를 게시하면, 검증자는 토큰을 발행할 수 있는 것을 결코 손에 쥐지 않습니다. JWT 인코더는 이 페이지가 만든 키를 그대로 받습니다.
- 웹훅과 릴리스 서명
- 공개 키를 한 번 게시하고 모든 페이로드를 개인 키로 서명하면, 소비자는 유출될 공유 자격 증명 없이 진위를 검증할 수 있습니다.
- 로컬 개발과 테스트
- 서명 검증을 다루는 테스트 스위트에는 일회용 키 쌍이 필요합니다. OpenSSL 호출 방법을 떠올리는 것보다 여기서 하나 생성하는 편이 빠릅니다.
- 키 쌍이 어떻게 생겼는지 익히기
- 알고리즘과 PEM 구조를 나란히 오가며 보면, 명세를 읽어서는 잡히지 않던 차이가 손에 잡힙니다.
- JWKS 엔드포인트 준비
- 공개 JWK는 OpenID Connect 디스커버리 문서의 keys 배열에 그대로 들어갑니다. 순환 중에 검증자가 고를 수 있도록 kid를 넣고, 개인 JWK는 그 파일에 넣지 마십시오.
- RSA에서 갈아타기
- 기존 RSA 키 옆에 Ed25519 대체 키를 생성해 크기를 비교한 뒤 전환을 확정하세요.
- 형식 불일치 해결
- 라이브러리가 파싱 오류로 키를 거부한다면, 다른 PEM 구조로 다시 내보내는 것만으로 대개 해결됩니다.
PEM 형식과 생성기 작동 원리
- 어느 컨테이너를 어디에 쓰나
- 키는 하나인데 포장은 다섯 가지입니다. 엉뚱한 것을 고르는 것이 키가 거부되는 가장 흔한 이유이고, 오류 메시지는 파싱 실패보다 더 구체적인 경우가 드뭅니다.
이미 갖고 있는 파일을 변환하려면컨테이너 PEM 헤더 담는 것 주로 만나는 곳 PKCS#8 BEGIN PRIVATE KEY 모든 알고리즘 Web Crypto, JDK, Go, .NET 등 최신 라이브러리 대부분 PKCS#1 BEGIN RSA PRIVATE KEY RSA 전용 OpenSSL 전통 출력, 일부 결제 게이트웨이, 오래된 Ruby·Perl 도구 SPKI / X.509 BEGIN PUBLIC KEY 모든 알고리즘, 공개 키 쪽 거의 모든 라이브러리가 기대하는 공개 키 PKCS#1 공개 BEGIN RSA PUBLIC KEY RSA 전용, 공개 키 쪽 레거시 RSA 도구 JWK 없음 — JSON입니다 모든 알고리즘 JWKS 엔드포인트, OIDC 디스커버리, JOSE 라이브러리 openssl pkcs8 -topk8 -nocrypt -in pkcs1.pem -out pkcs8.pem이 한 방향,openssl rsa -traditional -in pkcs8.pem -out pkcs1.pem이 그 반대 방향입니다. - 무작위성은 운영체제에서 옵니다
- Web Crypto는 플랫폼 엔트로피 원천 — 리눅스의 getrandom, 윈도우와 macOS의 시스템 CSPRNG — 에서 키 생성 시드를 얻습니다. OpenSSL이 끌어 쓰는 것과 같은 부류의 원천이며, 자바스크립트 의사 난수 생성기가 아닙니다.
- 생성이 페이지를 얼리지 않습니다
- crypto.subtle.generateKey는 비동기이며, 주요 브라우저 엔진에서는 소수 탐색이 메인 스레드 밖에서 일어나므로 4096비트 모듈러스를 찾는 동안에도 인터페이스가 반응합니다. 그래도 페이지는 스피너를 띄우는데, 그 탐색이 얼마나 걸릴지는 운에 달려 있기 때문입니다.
- PKCS#8이 PKCS#1을 감쌉니다
- PKCS#8 PrivateKeyInfo는 버전 번호, 알고리즘 식별자, OCTET STRING으로 이뤄집니다. 암호화되지 않은 rsaEncryption 키에서는 그 OCTET STRING 안에 완전한 PKCS#1 RSAPrivateKey가 들어 있으며, 이 페이지가 아무것도 다시 유도하지 않고 두 형식을 오가는 원리가 바로 이것입니다.
- 공개 키는 SubjectPublicKeyInfo를 씁니다
- BEGIN PUBLIC KEY는 X.509 SubjectPublicKeyInfo, 즉 알고리즘 식별자와 BIT STRING입니다. 그 비트 안에 무엇이 들어가는지는 알고리즘에 달려 있습니다. RSA에서는 PKCS#1 RSAPublicKey이며 그래서 BEGIN RSA PUBLIC KEY 쪽이 더 짧고, ECDSA에서는 압축하지 않은 곡선 위의 점, Ed25519에서는 32바이트 원시 키입니다.
- 공개 지수는 65537입니다
- 여기서 만드는 모든 RSA 키는 0x010001로 적는 값 e = 65537을 씁니다. 작은 지수 공격을 피할 만큼 크면서 켜진 비트가 둘뿐이라, 검증에는 제곱 16번과 곱셈 한 번이 듭니다.
- 지문은 PEM이 아니라 DER을 다이제스트합니다
- SHA-256 지문은 이진 SubjectPublicKeyInfo에 대해 계산됩니다. base64 텍스트를 대상으로 지문을 뜨면 줄바꿈 방식이 바뀔 때마다 값이 달라집니다. 로컬에서의 등가 명령은
openssl pkey -in private.pem -pubout -outform DER | openssl dgst -sha256 -binary | openssl base64입니다.
키 관리 모범 사례
- 키는 쓰일 곳에서 생성하기
- 네트워크를 건너간 개인 키는 지나온 모든 구간에 노출된 것입니다. 브라우저에서 생성하면 키 자체는 네트워크를 타지 않지만, 페이지의 코드는 여전히 네트워크로 도착합니다. 대상 호스트에서 생성하면 복사 단계마저 사라집니다. 운영 시스템을 지키는 키라면 호스트 쪽을 택하세요.
- RSA가 강제되지 않으면 Ed25519 우선
- Ed25519는 32바이트 키로 강력한 보안을 내면서 서명이 빠르고 잘못 고를 파라미터가 없습니다. 상대방이나 오래된 라이브러리가 선택지를 남기지 않을 때 RSA를 쓰세요.
- 2048비트를 하한으로 삼기
- NIST SP 800-131A는 2013년부터 서명 생성에 2048비트 미만 RSA를 금지했고, 어떤 공개 인증 기관도 그보다 작은 키에는 발급하지 않습니다. 여러 해 동안 운용할 키라면 3072이나 4096을 고르세요.
- 개인 키를 절대 커밋하지 않기
- 개인 키는 시크릿 관리자나 런타임에 읽는 환경 변수에 두세요. 키가 코드 저장소에 한 번 들어가면 안전한 대응은 순환뿐입니다.
- 사고 뒤에만이 아니라 일정에 따라 순환하기
- 옛 키를 폐기하기 전에 키 식별자와 함께 새 공개 키를 게시해, 겹치는 구간 동안 검증자가 양쪽을 모두 받아들이게 하세요. 평소에 연습한 순환만이 압박 속에서도 동작합니다.
자주 묻는 질문
웹사이트에서 개인 키를 생성해도 안전한가요?
PKCS#8과 PKCS#1의 차이는 무엇인가요?
PKCS#1 키를 PKCS#8로, 또는 그 반대로 어떻게 변환하나요?
RSA 개인 키에서 공개 키는 어떻게 얻나요?
RSA와 Ed25519 중 무엇을 골라야 하나요?
2048비트 RSA는 아직 충분히 강한가요?
이 키로 JWT에 서명할 수 있나요?
이 도구로 SSH 키를 생성할 수 있나요?
개인 키를 패스프레이즈로 보호할 수 있나요?
지문은 어디에 쓰나요?
관련 도구
모든 도구 보기 →AES 복호화 도구 — OpenSSL·CryptoJS 호환
보안 도구
온라인 AES 복호화 — GCM/CBC/CTR, 암호 문구 또는 원시 키, OpenSSL·CryptoJS "U2FsdGVkX1" 형식 자동 인식. 브라우저에서만 실행되며 키는 유출되지 않습니다.
AES 암호화 도구 — GCM, CBC, CTR 모드
보안 도구
무료 온라인 AES 암호화 도구 — AES-128/192/256, GCM/CBC/CTR, 암호 문구(PBKDF2) 또는 원시 키. 브라우저에서만 실행되고 서버 업로드는 없습니다.
Bcrypt 해시 생성 및 검증 도구
보안 도구
온라인으로 bcrypt 비밀번호 해시를 생성·검증하세요 — 조절 가능한 비용 인자, $2b$/$2a$/$2y$ 접두사 지원. 100% 브라우저에서 실행, 비밀번호는 업로드되지 않습니다.
HMAC 생성기 및 서명 검증 도구
보안 도구
무료 온라인 HMAC 생성·검증 도구. Text/Hex/Base64 키로 HMAC-SHA256/SHA1/SHA384/SHA512를 Hex/Base64/Base64URL로 출력. 100% 브라우저 실행, 키 유출 없음.
JWT 디코더 (JWT Decoder)
보안 도구
무료 JWT 디코더로 JWT 토큰을 온라인에서 즉시 디코딩. 헤더, 페이로드, 서명, 만료, 클레임 확인. 100% 브라우저 기반 — 토큰이 기기를 떠나지 않음. 가입·추적 없음.
JWT 인코더 (JWT Encoder)
보안 도구
무료 온라인 JWT 생성기·인코더. 헤더와 페이로드를 구성하고 HS256, RS256, ES256으로 즉시 서명. 100% 브라우저 기반 — 비밀 키와 개인 키가 기기를 떠나지 않음.