암호학: 전자서명

암호학 전자서명 정리입니다. 무결성, 인증, 부인 방지, 전자서명과 암호화 차이, OpenSSL ed25519 서명/검증 실습을 정리했습니다.

암호학: 전자서명 개념과 OpenSSL 검증 예제

전자서명은 문서나 데이터가 변경되지 않았고, 특정 개인키 소유자가 서명했다는 사실을 공개키로 검증하는 방식이다. 암호화가 기밀성을 주로 다룬다면, 전자서명은 무결성, 인증, 부인 방지를 다룬다.

전자서명이 해결하는 문제

속성의미
무결성서명 후 데이터가 바뀌면 검증 실패
인증해당 공개키에 대응되는 개인키로 서명했음을 확인
부인 방지서명자가 나중에 서명 사실을 부인하기 어렵게 함

기본 흐름

  1. 송신자가 메시지 본문를 hash한다.
  2. 송신자가 hash 값을 개인키로 서명한다.
  3. 수신자는 메시지 본문를 다시 hash한다.
  4. 수신자는 송신자의 공개키로 서명을 검증한다.
  5. 두 hash가 맞으면 메시지 변조가 없고, 해당 개인키로 서명된 것으로 판단한다.

전자서명과 암호화 차이

구분전자서명암호화
목적무결성, 인증기밀성
사용 key개인키로 서명, 공개키로 검증공개키로 암호화, 개인키로 복호화 또는 대칭키 사용
본문 공개 여부실습은 보통 별도로 전달됨본문을 숨김

OpenSSL로 서명 실습

아래 예시는 학습용 key를 생성하고 파일에 서명한 뒤 검증한다. 생성된 개인키는 실습 후 삭제하거나 안전한 위치에 보관한다.

mkdir -p ~/signature-lab
cd ~/signature-lab

openssl genpkey -algorithm ed25519 -out signer-private.pem
openssl pkey -in signer-private.pem -pubout -out signer-public.pem

printf 'approved change request 2026-06-23\n' > message.txt

openssl pkeyutl -sign \
 -inkey signer-private.pem \
 -rawin \
 -in message.txt \
 -out message.sig

openssl pkeyutl -verify \
 -pubin \
 -inkey signer-public.pem \
 -rawin \
 -in message.txt \
 -sigfile message.sig

검증이 성공하면 Signature Verified Successfully와 같은 결과가 나온다.

변조 테스트

메시지가 한 글자라도 바뀌면 검증이 실패해야 한다.

printf 'tampered change request 2026-06-23\n' > message.txt

openssl pkeyutl -verify \
 -pubin \
 -inkey signer-public.pem \
 -rawin \
 -in message.txt \
 -sigfile message.sig

운영에서 주의할 점

  • 개인키는 서명자만 접근할 수 있어야 한다.
  • 공개키가 누구의 것인지 인증서나 신뢰 저장소로 확인해야 한다.
  • 서명 알고리즘과 key 길이는 현재 기준에 맞춰 선택한다.
  • 서명 대상이 정확히 무엇인지 canonicalization 규칙을 명확히 해야 한다.
  • 서명 검증만 성공했다고 권한 검사가 끝난 것은 아니다. 서명자에게 그 작업 권한이 있는지도 별도로 확인해야 한다.

마무리

전자서명은 데이터를 숨기는 기술이 아니라, 누가 어떤 데이터에 서명했는지와 서명 후 데이터가 바뀌지 않았는지를 검증하는 기술이다. 실무에서는 인증서, key 관리, timestamp, 폐기 목록, 권한 정책까지 함께 설계해야 전자서명이 의미를 갖는다.

문서 링크

BGM EVER