Ed25519는 EdDSA(Edwards-curve Digital Signature Algorithm)를 Curve25519 기반의 트위스티드 에드워즈 곡선(edwards25519) 위에서 구현한 공개키 전자서명 방식입니다. 2011년 Daniel J. Bernstein 등이 설계했고, 지금은 OpenSSH·Git·TLS·암호화폐 지갑 등 거의 모든 곳에서 표준처럼 쓰입니다.
| 항목 | 값 |
|---|---|
| 보안 강도 | 약 128비트 (RSA-3072와 동급) |
| 개인키 | 32바이트 시드 |
| 공개키 | 32바이트 |
| 서명 길이 | 64바이트 (고정) |
| 해시 | SHA-512 내장 |
ECDSA는 서명할 때마다 무작위 난수(nonce)가 필요하고, 이 난수가 겹치거나 예측되면 개인키가 통째로 노출됩니다(소니 PS3 사건이 대표적). Ed25519는 nonce를 "개인키 + 메시지"의 해시로 결정론적으로 생성하기 때문에, 서명 시점에 좋은 난수원이 없어도 안전합니다.
| 알고리즘 | 키 길이/강도 | 특징 |
|---|---|---|
rsa | 3072~4096비트 권장 | 호환성 최고, 키·서명이 큼, 느림 |
ecdsa | 256/384/521비트 | NIST 곡선, nonce 의존, 곡선 신뢰 논쟁 |
ed25519 | 256비트 (≈RSA-3072) | 권장 — 빠르고 짧고 안전 |
ed25519-sk | 256비트 + 하드웨어 | FIDO2 보안키(YubiKey 등)에 개인키 보관 |
가장 기본적인 쓰임 — 서버 로그인용 키쌍을 만듭니다.
$ ssh-keygen -t ed25519 -a 100 -C "me@example.com" # -t ed25519 : 키 타입 # -a 100 : 개인키 암호화 KDF 반복 횟수(브루트포스 저항 ↑) # -C : 키 식별용 코멘트 # → ~/.ssh/id_ed25519 (개인키) / id_ed25519.pub (공개키) 생성
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server # 또는 수동으로 server의 ~/.ssh/authorized_keys 에 .pub 내용 추가
$ ssh user@server # 비밀번호 없이 키로 로그인되면 성공
ssh-agent에 등록해 세션 동안만 캐시하세요:
ssh-add ~/.ssh/id_ed25519
OpenSSH 8.0부터는 SSH 키로 임의의 데이터에 전자서명을 할 수 있습니다(ssh-keygen -Y).
접속용으로 쓰던 같은 Ed25519 키를 그대로 서명에도 쓸 수 있다는 게 핵심입니다.
# 서명 생성 → doc.txt.sig 파일이 만들어짐 $ ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n file doc.txt # 검증에 쓸 신뢰 서명자 목록(allowed_signers) 준비 $ echo "me@example.com $(cat ~/.ssh/id_ed25519.pub)" > ~/.ssh/allowed_signers # 서명 검증 $ ssh-keygen -Y verify -f ~/.ssh/allowed_signers \ -I me@example.com -n file -s doc.txt.sig < doc.txt # Good "me@example.com" signature ... 출력되면 검증 성공
-n)란?file,
Git 커밋 서명은 git을 씁니다. 검증 시 namespace가 일치해야 통과되어,
한 용도의 서명이 다른 용도로 오용되는 것을 막습니다.
Git 2.34부터 GPG 대신 SSH 키로 커밋·태그를 서명할 수 있습니다.
$ git config --global gpg.format ssh $ git config --global user.signingkey ~/.ssh/id_ed25519.pub $ git config --global commit.gpgsign true $ git config --global tag.gpgsign true # 검증용: 신뢰 서명자 파일 지정 (namespaces="git" 권장) $ echo "me@example.com namespaces=\"git\" $(cat ~/.ssh/id_ed25519.pub)" \ > ~/.ssh/allowed_signers $ git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
$ git commit -m "signed commit" $ git log --show-signature -1 # Good "git" signature for me@example.com ... 출력되면 성공
id_ed25519.pub)를 등록하면,
서명된 커밋에 초록색 Verified 배지가 붙습니다. (접속용 Authentication Key와 별도로 추가)
MariaDB는 비밀번호 인증에도 Ed25519를 쓸 수 있습니다. 기본
mysql_native_password는 SHA-1 기반이라, user 테이블의 해시가 유출되면
그대로 로그인에 재사용될 수 있습니다. ed25519 플러그인은 비밀번호로
개인키를 유도하고 서버에는 공개키만 저장한 뒤, 접속 시 챌린지-응답 서명으로 인증합니다.
따라서 저장된 값이 새도 비밀번호 복원이나 재사용이 불가능합니다.
client_ed25519
인증 플러그인을 지원해야 하며, MariaDB 클라이언트/커넥터에는 기본 포함되어 있습니다.
INSTALL SONAME 'auth_ed25519'; -- 설치 확인 SELECT plugin_name, plugin_status FROM information_schema.plugins WHERE plugin_name = 'ed25519';
-- 최신 문법: 평문 비밀번호를 주면 서버가 공개키로 변환해 저장 CREATE USER 'alice'@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret-passphrase'); GRANT ALL PRIVILEGES ON appdb.* TO 'alice'@'%'; FLUSH PRIVILEGES;
-- 해시를 먼저 뽑아서 USING '' 로 지정하는 방식 SELECT ed25519_password('secret-passphrase'); -- 예: =ZmsdgcAQ5... 같은 공개키 해시 반환 CREATE USER 'bob'@'%' IDENTIFIED VIA ed25519 USING '=ZmsdgcAQ5...';
$ mariadb -u alice -p appdb # 비밀번호 입력 후 접속되면 ed25519 인증 성공 # 어떤 플러그인으로 인증되는지 서버에서 확인 > SELECT user, plugin FROM mysql.user WHERE user='alice'; # plugin 컬럼이 ed25519 로 표시됨
mysql_native_password는 비밀번호 해시 자체가 사실상 "비밀"이라 유출되면 재사용됩니다.
ed25519는 서버에 공개키만 있고, 인증은 매 접속마다 다른 챌린지에 대한 서명으로 이뤄집니다.
공개키가 새도 서명을 위조할 수 없으므로 비밀번호도, 접속 권한도 지켜집니다.
지금까지 본 것을 한 장으로 정리하면 — 동일한 Ed25519 키쌍 원리가 세 영역에서 신원을 증명합니다.
| 영역 | 핵심 명령/설정 | 저장되는 것 |
|---|---|---|
| SSH 접속 | ssh-keygen -t ed25519 | 서버에 공개키(authorized_keys) |
| SSH/Git 서명 | ssh-keygen -Y sign, gpg.format ssh | allowed_signers의 공개키 |
| MariaDB 인증 | IDENTIFIED VIA ed25519 | mysql.user에 공개키 해시 |