공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 13 / 22

암호화·개인정보 보호

AES-GCM, 키 관리·교체, 검색용 HMAC, 컬럼 암호화, 마스킹
섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

3. 코드 예제

실행 방법입니다. 외부 jar 는 필요 없습니다.

powershell
cd java-src\extension\13_crypto
C:\project\jdk-21.0.8\bin\javac -encoding UTF-8 *.java
C:\project\jdk-21.0.8\bin\java -Dstdout.encoding=UTF-8 Main   # 약 1초

Crypto — 암호화·복호화·검색용 해시

java
public String encrypt(String plain) {
    SecretKey key = keys.get(currentVersion);
    byte[] iv = new byte[IV_LEN];
    RANDOM.nextBytes(iv); // IV 는 매번 새로 무작위 생성, 재사용 금지
    Cipher cipher = Cipher.getInstance(CIPHER_ALGO);
    cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(TAG_BITS, iv));
    byte[] ct = cipher.doFinal(plain.getBytes("UTF-8"));
    byte[] ivAndCt = new byte[iv.length + ct.length];
    System.arraycopy(iv, 0, ivAndCt, 0, iv.length);
    System.arraycopy(ct, 0, ivAndCt, iv.length, ct.length);
    return currentVersion + ":" + Base64.getEncoder().encodeToString(ivAndCt);
}

decrypt 는 접두어로 키 버전을 읽어 알맞은 키를 고른 뒤 IV 와 암호문을 분리해 복호화합니다. 태그 검증에 실패하면 AEADBadTagException 이 발생해 변조나 잘못된 키를 즉시 알 수 있습니다.

데모 실행 결과

text
1) 암호화 1회차: v1:M/IJdOxcBftSfTd/EFUXPnJXSdOdxJureibO6OeMrMkC6qUeaS/C3Sc=
1) 암호화 2회차: v1:yHicg0yubBgIz2h+aF1yGybF17q6dOaLFGrBzK9B/+siWlyQtu5R0Dk=
1) 서로 다른가?  true
2) 복호화 결과: 8501011234567
3) 변조 감지: 변조되었거나 키가 맞지 않습니다
4) 다른 키 복호화 실패: 변조되었거나 키가 맞지 않습니다
5) HMAC 1회차: zV8waLkgarLLDtow9KQkiJx1XSas9JdGdp4uhcHMTuM=
5) HMAC 2회차: zV8waLkgarLLDtow9KQkiJx1XSas9JdGdp4uhcHMTuM=
5) 동일한가?    true
6) 기존(v1) 토큰: v1:M/IJdOxcBftSfTd/EFUXPnJXSdOdxJureibO6OeMrMkC6qUeaS/C3Sc=
6) 재암호화(v2): v2:LOOL9zCTkJlBuPMLUj8I49P15S8MVbszTjfISz2u3V+8jbRCQ9fdK9Q=
6) v1 복호화:    8501011234567
6) v2 복호화:    8501011234567
7) 주민번호 마스킹: 850101-*******
7) 전화번호 마스킹: 010-****-5678
8) 평문 길이(byte): 13
8) 접두어 포함 저장 길이: 59

같은 평문(1번)이 두 번 암호화될 때마다 결과가 달라지는 이유는 IV 가 매번 무작위로 바뀌기 때문입니다. 6번은 옛 키(v1)로 저장된 값을 읽어 새 키(v2)로 재암호화하는 키 교체 흐름을 보여줍니다.

예제 직접 실행

아래 폴더를 JDK 21 로 컴파일하고 실행합니다. 외부 jar 를 쓰는 레슨은 java-src/lib 를 클래스패스에 넣습니다.

cd java-src\extension\13_crypto
javac -encoding UTF-8 *.java && java Main

:: 외부 jar 가 필요한 레슨
javac -encoding UTF-8 -cp "..\..\lib\*;." *.java && java -cp "..\..\lib\*;." Main
코드 예제
  • Crypto — 암호화·복호화·검색용 해시
  • 데모 실행 결과
이전 섹션2 핵심 원리3 / 7다음 섹션4 응용 변형 예제