전자서명

개인키로 서명하고 공개키로 검증하여, 데이터의 무결성과 송신자 인증을 보장하는 방식입니다.

핵심 구조

[서명]
송신자: 데이터 + 개인키 → 서명(Signature) 생성 후 함께 전송

[검증]
수신자: 서명 + 공개키 → 검증 (원본 데이터와 일치 여부 확인)

동작 과정

1. 송신자가 데이터를 해시 함수로 해시값 생성
         ↓
2. 해시값을 개인키로 암호화 → 서명 생성
         ↓
3. 데이터 + 서명 함께 전송
         ↓
4. 수신자가 공개키로 서명 복호화 → 해시값 추출
         ↓
5. 수신한 데이터를 동일한 해시 함수로 해시값 생성
         ↓
6. 두 해시값 비교 → 일치하면 검증 성공 O

보장하는 것

항목설명
무결성데이터가 중간에 변조되지 않았음을 보장
인증서명자가 개인키 소유자임을 증명
부인 방지서명 후 송신 사실을 부인 불가

공개키 암호화와의 차이

공개키 암호화전자서명
목적기밀성 (내용 보호)인증 + 무결성
암호화 키공개키개인키
복호화 키개인키공개키

실사용 예시

사례내용
HTTPS (TLS)서버 인증서 서명 검증
JWT (RS256)서버가 개인키로 서명, 클라이언트가 공개키로 검증
코드 서명앱 배포 시 변조 여부 확인
공인인증서금융거래 시 본인 인증

Java 예시

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGen.generateKeyPair();

// 서명 생성
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(keyPair.getPrivate());
signature.update("전송할 데이터".getBytes());
byte[] sign = signature.sign();

// 서명 검증
signature.initVerify(keyPair.getPublic());
signature.update("전송할 데이터".getBytes());
boolean isValid = signature.verify(sign); // true

전자서명은 데이터를 숨기는 게 아니라 "이 데이터가 나로부터 왔고, 변조되지 않았다" 는 것을 증명하는 데 목적이 있습니다.

CSLOG에서 보기