전자서명
개인키로 서명하고 공개키로 검증하여, 데이터의 무결성과 송신자 인증을 보장하는 방식입니다.
핵심 구조
[서명]
송신자: 데이터 + 개인키 → 서명(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
전자서명은 데이터를 숨기는 게 아니라 "이 데이터가 나로부터 왔고, 변조되지 않았다" 는 것을 증명하는 데 목적이 있습니다.