🚀 2026 스타트업 컨퍼런스

복잡한 암호화 서명, 쉘 스크립트 한 줄로 끝내는 법 (feat. Ed25519)

복잡한 암호화 서명, 쉘 스크립트 한 줄로 끝내는 법 (feat. Ed25519)

김현수·2026년 1월 4일·3

복잡한 암호화 서명을 ed25519-cli 도구와 쉘 스크립트 한 줄로 간단하게 처리하는 방법과 유닉스 철학이 담긴 도구 활용법을 소개합니다.

솔직히 고백할게요.

저는 개발 10년 차지만, 아직도 암호화 코드를 직접 짤 때마다 손이 떨립니다.

"내가 만든 난수 생성기가 정말 안전할까?"

"이 라이브러리 버전, 보안 취약점은 없나?"

이런 걱정, 저만 하는 거 아니죠?

보안 업계에는 아주 오래된 격언이 하나 있습니다.

"절대 직접 암호화 코드를 짜지 마라(Don't roll your own crypto)."

검증된 도구를 쓰는 게 정답이라는 말입니다.

보통 우리는 OpenSSL 같은 거대한 도구를 떠올립니다.

그런데 가끔은 너무 무겁게 느껴질 때가 있어요.

옵션은 또 왜 그렇게 많은지, 매뉴얼 읽다가 밤샐 기세죠.

오늘 커피 한 잔 하면서 이야기하고 싶은 도구는 아주 작고 단단한 녀석입니다.

바로 ed25519-cli입니다.

이름에서 알 수 있듯이, Ed25519 서명 시스템을 다루는 명령줄 도구예요.

Ed25519가 뭐냐고요?

현재 가장 빠르고 안전하다고 평가받는 공개키 서명 알고리즘 중 하나입니다. 비트코인이나 SSH 키 생성할 때 많이 보셨을 겁니다.

이 도구는 lib25519라는 라이브러리에 포함되어 있는데요.

제가 이 도구를 보고 무릎을 탁 쳤던 이유는 딱 하나입니다.

"정말 지독하게 유닉스(Unix)스럽다."

이게 무슨 말이냐고요?

보통의 CLI 도구들은 -i input.txt -o output.txt 이런 식으로 플래그를 씁니다.

그런데 이 녀석은 다릅니다. 철저하게 표준 입출력과 파일 디스크립터(File Descriptor)만 사용합니다.

사용법을 한번 볼까요?

먼저 키를 생성하는 ed25519-keypair 명령어입니다. 이 명령어를 실행하면 공개키와 비밀키(개인키)가 동시에 만들어집니다.

재미있는 건 결과가 나오는 '구멍'입니다. 공개키는 5번 파일 디스크립터로 나옵니다. 비밀키는 9번 파일 디스크립터로 나오고요.

쉘 스크립트에서는 이렇게 씁니다.

ed25519-keypair 5>publickey 9>secretkey

처음엔 오타인 줄 알았습니다. "5번이랑 9번? 왜 1번(표준 출력)이나 2번(표준 에러)이 아니지?"

곰곰이 생각해보니 개발자의 깊은 뜻이 느껴지더군요. 키 생성처럼 민감한 작업에서 데이터가 섞이는 걸 원천 봉쇄하겠다는 의지죠. 로그 찍다가 실수로 비밀키가 화면에 출력되는 대참사를 막을 수 있습니다.

그럼 서명은 어떻게 할까요? ed25519-sign 명령어를 씁니다.

여기서도 독특한 파이프라인이 등장합니다. 비밀키는 8번 디스크립터로 밀어 넣습니다. 서명할 메시지는 표준 입력(0번)으로 받고요. 결과는 표준 출력(1번)으로 나옵니다.

ed25519-sign 8<secretkey <message >signedmessage

어떤가요? 명령어 한 줄에 "누가, 무엇으로, 무엇을" 처리하는지가 명확하게 보입니다.

마지막으로 검증입니다. ed25519-open 명령어를 사용합니다. 공개키를 4번 디스크립터로 넣습니다. 서명된 메시지를 입력으로 주면, 검증된 원본 메시지가 튀어나옵니다.

ed25519-open 4<publickey <signedmessage >message

만약 서명이 위조되었다면요? 아무것도 출력하지 않고 종료 코드 100을 뱉으며 죽어버립니다. 아주 쿨하죠.

성공하면 0, 실패하면 0이 아닌 값. 이 단순함 덕분에 쉘 스크립트에서 if 문으로 처리하기가 너무 편합니다. 복잡한 라이브러리를 임포트하고, 객체를 생성하고, 예외 처리를 할 필요가 없습니다. 그저 파이프만 연결하면 끝이니까요.

물론 C나 Python 같은 언어에서 FFI로 라이브러리를 직접 불러다 쓸 수도 있습니다. 하지만 인프라를 운영하거나 간단한 배포 스크립트를 짤 때는 이런 CLI 도구가 구세주 같습니다. 메모리 부족 같은 시스템 에러가 나면 0이 아닌 값을 반환하며 확실하게 멈춰줍니다. 어설프게 동작하는 것보다 확실하게 실패하는 게 운영 환경에서는 훨씬 낫거든요.

저는 주니어 시절, 뭔가 있어 보이는 복잡한 도구를 쓰는 게 실력이라고 착각했습니다. 그런데 연차가 찰수록 생각이 바뀝니다. 진짜 좋은 도구는 설명서 없이도 흐름이 읽히는 도구입니다. 그리고 한 가지 일만 아주 잘해내는 도구죠.

ed25519-cli는 그런 면에서 엔지니어링의 미학을 보여줍니다.

혹시 지금 서버 간 통신을 검증해야 하거나, 설정 파일의 무결성을 체크해야 하나요? 무겁게 코딩하지 말고 이 작은 도구를 스크립트에 툭 얹어보세요. 여러분의 퇴근 시간이 30분은 빨라질지도 모릅니다. 가장 단순한 것이 가장 강력할 때가 있으니까요.

김현수
김현수10년 차 시니어 개발자

SI의 척박한 땅에서 시작해 빅테크의 대규모 트래픽까지 경험한 생존형 개발자입니다. '화려한 기술'보다 '퇴근을 보장하는 안정성'을 신봉하며, 주니어들의 삽질을 방지하기 위해 펜을 들었습니다.

김현수님의 다른 글

댓글 0

첫 번째 댓글을 남겨보세요!